2009-05-05 28 views

回答

9

也許,但可能不是。

事件只能設置或不設置,如果沒有任何事件可以取消設置,那麼Set的重複調用不會改變它的狀態,除非它是一個自動重置事件,並且至少有一個線程正在等待它。通過手動重置事件,等待(或開始等待)的任何線程將被釋放,直到事件被解除。

我想你會真的想要一個信號,它確實有一個計數和支持設置ň次發佈ñ線程(即使其中一些線程纔開始等待後,一些通話設置)。

+0

是的,我想要一個信號燈。我記得它的機制,但不是名字。自從我爲資源池編寫低級線程代碼已經有一段時間了。 – 2009-05-05 20:23:25

3

這取決於EventResetMode。如果它設置爲EventResetMode.AutoReset它只會釋放一個線程。如果它是'EventResetMode.ManualReset',但是它會釋放在事件上被阻塞的所有線程。

Semaphore.Release(Int) 

其中int是計數會做到這一點一個方式。

+0

有沒有辦法讓它釋放X線程,其中X是調用waitHandle.Set()'的次數? – 2009-05-05 20:11:55

+0

是的。將其創建爲Auto。你想做什麼?如果你能提供更多信息,我相信有更好的方法。正如下面提到的,你也可以使用信號量,但有些東西聞起來很腥。 – 2009-05-05 20:15:37

+0

不,自動重置事件在這裏不合適。你依賴於調用Set的線程只調用一次。如果事件在任何線程等待滿足之前被設置了兩次,那麼只有一個等待線程運行。 – 2009-05-05 20:33:45

1

正如Richard所述,EventWaitHandles只有一個標誌並且不能計算Set被調用的次數。添加計數變量的簡單解決方案會導致競爭條件。

William Kempf有一個article爲什麼計數變量不起作用,以及使用.Net Monitor類的解決方案。

相關問題