程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WaitHandle、AutoResetEvent、ManualResetEvent整理

WaitHandle、AutoResetEvent、ManualResetEvent整理

編輯:C#入門知識

 

WaitHandle是一個用以控制線程同步的類,有WaitOne()方法,用以阻止當前線程(提前是其狀態為Nonsignaled,即紅燈,後面解釋),直到當前的 WaitHandle 收到綠燈信號。 WaitHandle有兩個狀態"Signaled" and "Nonsignaled"前者可以理解為綠燈,綠燈狀態時WaitOne方法無效,當前線程不會被阻止,後者可以理解為紅燈,WaitOne()方法會阻止當前線程。 這兩個狀態是通過函數Set()和Reset()來設置的。前者設為綠燈,後者設為紅燈。
  (1):一般來說,初始狀態都是"Nonsignaled",即紅燈,這樣當WaitOne時,線程會暫停掉,這正是通常情況下我們調用WaitOne時想要的效果。這也正是Reset(字面義“重置”)被定義為設成紅燈的原因。所以初始化時參數用false,代表初始狀態為紅燈 ManualResetEvent manualWait = new ManualResetEvent(false); (2)WaitHandle沒有Set方法,所以不能使暫停的線程得以繼續,所以 一般不單用WaitHandle。其常會用作參數,尤其是AutoResetEvent和ManualResetEvent都用到的情況,提供一定的通用性。
  AutoResetEventManualResetEvent都繼承自WaitHandle,都有Set()和Reset()方法,當然也繼承了WaitOne()方法和兩個狀態。 (1)ManualResetEvent的Set()和Reset()方法即上面的功能,將狀態分別設成綠燈和紅燈。 (2)AutoResetEvent比較特別,正如名字所示,在Set()完後,它會立即自動調用Reset,所以一般只用Set()方法。
  說明:這類對象可以被用在多個並發線程中,只要調用WaitOne,則都會暫停運行。ManualResetEventSet,可以讓所有這些線程都繼續運行,Reset又都停止,而AutoResetEvent則通過Set可實現一次只有一個被阻止的線程釋放。    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved