下面是一個例子:如何處理多線程中的競態條件?
if (control.InvokeRequired)
{
control.BeginInvoke(action, control);
}
else
{
action(control);
}
如果條件和之間的BeginInvoke什麼叫控制設置,例如?
具有事件做又如:
var handler = MyEvent;
if (handler != null)
{
handler.BeginInvoke(null, EventArgs.Empty, null, null);
}
如果MyEvent
是第一行,if語句,if語句仍然會執行之間退訂。但是,這是適當的設計?如果取消訂閱也會導致正確調用該事件所需的狀態被破壞?這個解決方案不僅有更多的代碼行(樣板文件),而且它不那麼直觀,並且可能導致客戶端的意外結果。
什麼說你呢?
上面描述的用於事件處理程序的模式存在的原因是保持對處理程序的引用處於活動狀態,因此無法處理。 –
@Mitch Wheat:是的,我並不是說處理程序必須處置,但是如果客戶端退出事件,他或她也可能決定不再需要某種通常只由事件處理程序使用的狀態對象。由於該事件仍然在退訂後出現不幸的時機,因此可能很難追蹤錯誤,因爲預期的結果是處理程序在退訂後不會運行。 –
@Mitch看到我的答案。 –