2010-07-22 111 views
32

我有一個WaitHandle,我想知道如何檢查WaitHandle是否已經設置。如何檢查WaitHandle是否已設置?

注意:我可以添加一個bool變量,並且無論何時使用Set()方法將該變量設置爲true,但此行爲必須在WaitHandle的某個位置構建。

感謝您的幫助!

+0

我的回答是之前SwDevMan唯一秒,這是更清晰,包括文檔報價,所以我刪除它。但是,我仍然想知道:「您是否正在處理可能已被重置的自動重置事件,或者測試代碼是否不能重置?」 – 2010-07-24 18:19:58

回答

47

WaitHandle.WaitOne(0)嘗試

如果millisecondsTimeout是零,該方法不會阻塞。它測試等待句柄的狀態並立即返回。

+1

*慚愧*謝謝! – 2010-07-22 20:30:35

+0

+1好的清楚答案。雖然我會建議將「嘗試」更改爲「使用」,但不錯。就目前而言,你似乎不確定你的答案。 – 2010-07-22 20:31:46

+3

唯一的問題是,對於一些WaitHandles(自動重置事件,信號量),就緒狀態實際上將通過等待來重置。 – 2010-07-24 18:21:26

2

使用上WaitHandleWait...方法,需要一個超時值,如WaitOne一個,並通過爲0

1

超時可以使用WaitOne(int millisecondsTimeout, bool exitContext)方法和在0通爲時間跨度。它會立即返回。

bool isSet = yourWaitHandle.WaitOne(0, true); 
+0

他們爲什麼要使用帶'exitContext'值的引用?考慮到有些方法不需要這個領域,你應該解釋它的必要性。 – 2010-07-22 20:34:30

+0

VS2005的在線幫助只顯示WaitOne(),WaitOne(int,bool)和WaitOne(TimeSpan,bool)。所以,很可能他們沒有找到WaitOne(int) – 2011-11-15 16:09:57

5
const int DoNotWait = 0; 

ManualResetEvent waitHandle = new ManualResetEvent(false);     

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

waitHandle.Set(); 

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait)); 

輸出:

是集:假

是集:真

+0

爲什麼要爲變量使用關鍵字?這是不必要的,讓你的回答更難閱讀。 – 2010-07-22 20:31:07

+0

@Jeff當然,這只是一個很難的事情了一些示例代碼來命名,今天我已經寫了很多代碼。 – 2010-07-22 20:33:32

+0

@chibacity:寫事件比事件更容易。 'waitHandle','resetEvent','mre','myEvent'。名單是無止境的,它會讓你的例子更好。 – 2010-07-22 20:35:46