2

在我的代码中,我有以下功能:

void OnEvent(....){ SaveData();}

其中 SaveData 看起来像:

void SaveData()
{
    new Thread(
        ()=>
        {
            lock(data)
            {
                Serialize(data);
            }
        }).Start();
}

我的问题是,在序列化过程中,事件可能会被触发多次,我希望在初始序列化过程结束后只执行一次序列化。

c# 最好的方法是什么?

4

1 回答 1

3

您有许多问题需要解决:

首先,不要使用Thread类。真的。除非您正在为并行处理编写框架,否则如果您使用Thread. 使用类似System.Threading.Tasks.Task或(如果您使用的是 4.0 之前的 .NET 版本)System.Threading.ThreadPool来安排代码的异步执行。

其次,您应该知道data在线程之间共享实例变量是有粘性的。最好将要保存的数据传递异步函数,这样就不会出现争用或竞争条件的问题。

第三,如果这是执行顺序,您希望发生什么:

<things happen>
OnEvent fires
<things happen>
Serialize starts
OnEventFires
Serialize completes

由于OnEvent在 中间触发Serialize,它应该完全忽略它还是应该安排另一个序列化?如果你在这里回答“b”,这里会发生什么?

<things happen>
OnEvent fires
<things happen>
Serialize starts
OnEvent fires
<things happen>
OnEvent fires
Serialize completes

应该安排两个电话Serialize,还是只安排一个电话?

于 2012-04-26T20:56:16.500 回答