将保存信息同步到文件的最佳方法

时间:2012-04-26 20:46:53

标签: c# multithreading

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

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

其中SaveData类似于:

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

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

c#的最佳方法是什么?

1 个答案:

答案 0 :(得分: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

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

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

是否应该安排两次Serialize的调用,或只安排一次?