2012-12-05 66 views
13

我想知道,新的AutoResetEvent(true)在C#中的用法?

爲什麼我會永遠想在AutoResetEvent的構造函數傳遞一個true

我創建了一個waitHandle,以便任何人打電話WaitOne()實際上會等待

如果我用true對它進行實例化,它就好像它立即發送信號 - 這就像沒有等待的正常流程。

EventWaitHandle _waitHandle = new AutoResetEvent (false); 

void Main() 
{ 
    new Thread (Waiter).Start(); 
    Thread.Sleep (1000);     
    _waitHandle.Set();      

Console.ReadLine(); 
} 
    void Waiter() 
    { 
    Console.WriteLine ("AAA"); 
    _waitHandle.WaitOne();     
    Console.WriteLine ("BBBB"); 
    } 

輸出:

AAA...(delay)...BBB 

更改爲:EventWaitHandle _waitHandle = new AutoResetEvent (true);和輸出將是:

AAABBB 

問題

  • 爲什麼我會永遠想 去做這個 ? (通過true)?

回答

9

的情況將是調用WaitOne第一線程應立即通過,而不會阻塞。

檢查Silverlight documentation for AutoResetEvent(奇怪的是該文檔是不是在.NET版本的相同):

指定trueinitialState創建於 信號狀態的AutoResetEvent。如果你想第一個線程 等待AutoResetEvent被立即釋放,沒有 阻斷這是有用的「

+1

詞「釋放」是非常混亂的好像你正在釋放線程的CPU時間片,但是你實際上是讓它繼續工作,通過'.WaitOne()'調用。 – newprint

+0

你說得對,它很混亂,我在該文檔頁面上添加了一條評論 – jeroenh

7

這裏有一個很好的解釋:。Signaling with Event Wait Handles

套用,等待句柄像一個旋轉門,WaitOne的調用者就像一排排在旋轉門的人排隊,每調用一次Set,旋轉門就允許一個人通過(通常按照他們排隊的順序,但有時候不會,由於操作系統怪癖) 。

如果它是用'true'構造的,那麼旋轉門已經打開,但只有一個人,這樣WaitOne的第一個呼叫者將立即'放過',但任何後續的呼叫者仍然必須排隊。

很明顯,如果你只有一個調用者WaitOne,那麼這個方法都不適用,所以'true'選項是沒有意義的。

1

當然。

一個要求 - 線程X必須在應用程序啓動時運行,此後每10秒運行一次。定時的WaitForSingleObject(myARE,10000)將完成這項工作。將ARE初始化爲'true'將確保線程在啓動時運行。

編輯:

myARE.WaitOne(10000); 

對不起 - 我退學的C#模式爲WINAPI,簡要:(

+0

謝謝@jeroenh - 我試圖自己添加代碼塊,但我的ISP今天再次採取行動,DNS上/下間歇性:( –

相關問題