文章轉載自:C# AutoResetEventhtml
AutoResetEvent 經常被用來在兩個線程之間進行信號發送web
AutoResetEvent是.net線程簡易同步方法中的一種,兩個線程共享相同的AutoResetEvent對象,線程能夠經過調用AutoResetEvent對象的WaitOne()方法進入等待狀態,而後另一個線程經過調用AutoResetEvent對象的Set()方法取消等待的狀態。函數
在內存中保持着一個bool值,若是bool值爲False,則使線程阻塞,反之,若是bool值爲True,則使線程退出阻塞。當咱們建立AutoResetEvent對象的實例時,咱們在函數構造中傳遞默認的bool值,如下是實例化AutoResetEvent的例子。spa
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
該方法阻止當前線程繼續執行,並使線程進入等待狀態以獲取其餘線程發送的信號。WaitOne將當前線程置於一個休眠的線程狀態。WaitOne方法收到信號後將返回True,不然將返回False。.net
autoResetEvent.WaitOne();
WaitOne方法的第二個重載版本是等待指定的秒數。若是在指定的秒數後,沒有收到任何信號,那麼後續代碼將繼續執行。線程
static void ThreadMethod() { while(!autoResetEvent.WaitOne(TimeSpan.FromSeconds(2))) { Console.WriteLine("Continue"); Thread.Sleep(TimeSpan.FromSeconds(1)); } Console.WriteLine("Thread got signal"); }
這裏咱們傳遞了2秒鐘做爲WaitOne方法的參數。在While循環中,autoResetEvent對象等待2秒,而後繼續執行。當線程取得信號,WaitOne返回爲True,而後退出循環,打印"Thread got signal"的消息。code
AutoResetEvent Set方法發送信號到等待線程以繼續其工做,如下是調用該方法的格式。htm
autoResetEvent.Set();
下面的例子展現瞭如何使用AutoResetEvent來釋放線程。在Main方法中,咱們用Task Factory建立了一個線程,它調用了GetDataFromServer方法。調用該方法後,咱們調用AutoResetEvent的WaitOne方法將主線程變爲等待狀態。在調用GetDataFromServer方法時,咱們調用了AutoResetEvent對象的Set方法,它釋放了主線程,並控制檯打印輸出dataFromServer方法返回的數據。對象
class Program { static AutoResetEvent autoResetEvent = new AutoResetEvent(false); static string dataFromServer = ""; static void Main(string[] args) { Task task = Task.Factory.StartNew(() => { GetDataFromServer(); }); //Put the current thread into waiting state until it receives the signal autoResetEvent.WaitOne(); //Thread got the signal Console.WriteLine(dataFromServer); } static void GetDataFromServer() { //Calling any webservice to get data Thread.Sleep(TimeSpan.FromSeconds(4)); dataFromServer = "Webservice data"; autoResetEvent.Set(); } }