在我的代码中,我有以下功能:
void OnEvent(....){ SaveData();}
其中SaveData类似于:
void SaveData()
{
new Thread(
()=>
{
lock(data)
{
Serialize(data);
}
}).Start();
}
我的问题是,在序列化过程中,事件可能会多次触发,我希望序列化只能在初始序列化过程结束后执行一次。
c#的最佳方法是什么?
答案 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
由于OnEvent
在Serialize
的中间触发,它应该完全忽略它还是应该安排另一个序列化?如果你在这里回答“b”,那么这里会发生什么?
<things happen>
OnEvent fires
<things happen>
Serialize starts
OnEvent fires
<things happen>
OnEvent fires
Serialize completes
是否应该安排两次对Serialize
的调用,或只安排一次?