如何正确地同步这个?目前有可能SetData
在e.WaitOne()
已完成之后调用,因此d
可能已被设置为另一个值。我试图插入锁,但它导致了一个死锁。C#线程与AutoResetEvent问题
AutoResetEvent e = new AutoResetEvent(false);
public SetData(MyData d)
{
this.d=d;
e.Set(); // notify that new data is available
}
// This runs in separate thread and waits for d to be set to a new value
void Runner()
{
while (true)
{
e.WaitOne(); // waits for new data to process
DoLongOperationWith_d(d);
}
}
将最好的解决办法是引入一个新的布尔变量dataAlreadyBeenSetAndWaitingToBeProcessed
是在SetData
设置为true,并在DoLongOperationWith_d
结束它可以被设置为true,所以如果SetData
被调用,这个变量设置为true它可能会返回?
@Spencer Ruport:什么?如果挂起设置为true,则第一次调用SetData时,它将第二次抛出。我敢肯定,有一些办法可以打破这种情况,但我认为这不符合你所描述的顺序。 – Sean 2009-08-17 23:43:43
但this.d不能设置,除非挂起是假的。 – 2009-08-17 23:44:16
我的不好。我没有在那里看到'if(pending)'。 – 2009-08-17 23:46:25