如果我在Semaphore類的某個對象上使用WaitOne(Int32)方法(或 - 一般爲 - WaitHandle類),直到.NET 4.5的documentation以0(零)作爲參數,它不會阻塞並且可以用於測試信號量的當前狀態:.NET 4.5信號量WaitOne(0)不會阻塞,但會減少信號計數
「如果millisecondsTimeout爲零,則該方法不會阻塞它測試等待句柄的狀態並返回立即。」
對我來說,這是非常令人困惑(甚至是誤導的),因爲它不會阻止,但減一信號計數。所以,如果我用這樣的:
If (!mySemaphore.WaitOne(0)) DoSomething();
則可以遞減我旗語(如果爲true),導致其他線程無法運行。所以我們不能像這樣使用它來測試信號量的狀態。正確的使用應該是
If (!mySemaphore.WaitOne(0)) DoSomething();
Else mySemaphore.Release();
所以它不僅測試信號量的狀態!我對嗎?
簡單的測試,而不遞減是沒有意義的,因爲你得到的答案是立即過時和無用的,因爲畢竟它已被寫入供您閱讀一些其他的線程可以更改答案,但你讀過它。 – GSerg 2014-11-04 15:39:09
@CodeCaster無視,我只是愚蠢的。 – decPL 2014-11-04 15:48:23
好吧,我可以同意,但是...想象一下,反轉的情況 - 當WaitOne(0)結果爲真時 - 它不會改變信號量的狀態,結果是沒用的,同時另一個線程可能釋放信號量。 – pincur 2014-11-04 15:50:50