2011-02-18 30 views
0

我想知道如何在運行時安全地更改線程應該等待的EventWaitHandle。如何在運行時替換WaitHandle線程應該等待

假設有兩個線程(A和C)通過EventWaitHandles同步。 A循環執行其工作,並且C等待,直到它從A收到通知它可以開始執行其工作(例如通過AutoResetEvent)。這種模式是ACAC的...

後來一個新的線程(B)啓動(例如通過用戶操作),它的工作應該在兩個先前的線程之間以這種方式執行:A完成它的工作,然後發出信號B並且一旦B完成它的信號C.現在的模式是ABCABC ...

因此,在線程C正在等待與A共享的EventWaitHandle並且稍後應該有一個安全機制使得C在另一個EventWaitHandle上等待共享B.在我看來,棘手的部分是替換C使用的EventWaitHandle,因爲一旦完成,我應該很容易啓動B,它將使用EventWaitHandle等待A作業和EventWaitHandle發送C作業信號。該機制還應該提供一種方法來安全地卸載線程B並返回到只有線程A和C正在工作的初始狀態。

有沒有一種安全的方法來完成這與EventWaitHandle?如果沒有,任何其他建議,將不勝感激。

+0

如果您使用的是.NET 4.0,那麼使用任務將會使這個更簡單。從本質上講,你有三個任務,A「繼續」B和B「繼續」C「。在沒有任何事情要做的情況下,B本質上什麼都不做,但是當有時候會做某事。而不是試圖從混音中「插入」和「刪除」B,它可能/應該始終處於混音中。這將使這一切都變得難以維持。 – 2011-02-18 10:34:39

回答

0

如果任務A知道更改,則讓任務C擁有該事件。如果C是下一個,任務A就向任務C的事件發出信號,如果任務B是下一個任務,則向任務B的事件發出信號。

或者,使用與更改任何其他共享數據相同的機制:跨所有對句柄的訪問獲取互斥鎖。例如任務C獲取鎖,讀取句柄,釋放鎖,等待句柄。要改變它,你有UI線程獲取鎖,改變手柄,釋放鎖。

+0

謝謝我嘗試了你的第二選擇,它工作。然而,改變句柄,在獲得鎖之前,我必須發信號通知前一個句柄以避免死鎖 – 2011-02-19 08:51:28

0

您是否想過如何實現某種調度程序,其中的線程可以通過一個句柄來註冊(取消註冊)以啓動併發出完成信號。然後,調度程序通過設置適當的啓動事件來處理下一個線程,並在下一個線程繼續執行時,前一個線程設置完成事件。

+0

這似乎是一個可以稍後嘗試的優雅解決方案,謝謝! – 2011-02-19 08:52:12

相關問題