2010-10-21 132 views
3

什麼是重置擁有線程等待信號量的最佳方法。現在我所能想到的只是做一個while循環並釋放信號量,直到出現信號量完全異常。我不確定什麼是最佳做法。重置信號量

semaphore.Close(); 
semaphore = new Semaphore(0,1); 

或者

while(true) 
{ 
    try 
    { 
     semaphore.Release(); 
    } 
    catch 
    { 
     break; 
    } 
} 
semaphore = new Semaphore(0,1); 

回答

4

如果你想這樣做,你確定你想Semaphore開始嗎?也許ManualResetEvent會更合適?

2

沒有其他方法可以確保現有的信號量已滿,除了執行所顯示的循環。如果你真的想這樣做,那麼你的方法就是這樣。不過,您可能應該將catch更改爲catch (SemaphoreFullException)

也就是說,做你所談論的事情有特別的危險。如果某個其他線程在開始填充信號之前已經獲取了信號量,或者在您試圖填充它時在信號量上執行WaitOne,那麼當該線程執行Release時,它將獲得SemaphoreFullException

如果您正在「重置」您的程序以準備開始新的運行或某事,那麼您的第一個示例是要走的路:銷燬信號並創建一個新的信號。當然,在你這樣做之前,你需要確保沒有任何活動的線程想要使用舊的信號量。 。 。