如何正確地同步這個?目前有可能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