1.定義
MSDN定義:
通知一個或多個正在等待的線程已發生事件。此類不能被繼承。
詳細說明:
ManualResetEvent 允許線程通過發信號互相通信。通常,此通信涉及一個線程在其他線程進行之前必須完成的任務。當一個線程開始一個活動(此活動必須完成后,其他線程才能開始)時,它調用 Reset 以將 ManualResetEvent 置於非終止狀態,此線程可被視為控制 ManualResetEvent。調用 ManualResetEvent 上的 WaitOne 的線程將阻止,並等待信號。當控制線程完成活動時,它調用 Set 以發出等待線程可以繼續進行的信號。並釋放所有等待線程。一旦它被終止,ManualResetEvent 將保持終止狀態(即對 WaitOne 的調用的線程將立即返回,並不阻塞),直到它被手動重置。可以通過將布爾值傳遞給構造函數來控制 ManualResetEvent 的初始狀態,如果初始狀態處於終止狀態,為 true;否則為 false。
2.使用說明
2.1初始化一個ManualResetEvent對象,例如:
ManualResetEvent manual = new ManualResetEvent(true);//初始化時設置對象為終止狀態,在使用等待之前要用Reset()改變對象為非終止狀態 ManualResetEvent manual = new ManualResetEvent(false);//初始化時為非終止狀態
2.2設置超時等待
第一種:永遠等待下去直到收到繼續進行的信號為止。
manual.WaitOne()//永遠等待直到收到繼續信號為止
第二種:設置等待的超時時間,超時以后WaitOne返回一直未False,未超時返回true
manual.WaitOne(new TimeSpan(0,0,5));//設置等待超時的時間,
2.3ManualResetEvent類的結構以及主要方法和屬性的說明
類常用方法說明:
| 名稱 |
說明 |
| Close() |
釋放由當前 WaitHandle 占用的所有資源。 |
| WaitAll(WaitHandle[]) |
等待指定數組中的所有元素都收到信號。 |
| WaitAll(WaitHandle[], Int32) |
等待指定數組中的所有元素接收信號,同時使用 Int32 值指定時間間隔。 |
| WaitAll(WaitHandle[], Int32, Boolean) |
等待指定數組中的所有元素收到信號,使用 Int32 值指定時間間隔,並指定是否在等待之前退出同步域。 |
| WaitAll(WaitHandle[], TimeSpan) |
等待指定數組中的所有元素接收信號,同時使用 TimeSpan 值指定時間間隔。 |
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
等待指定數組中的所有元素收到信號,使用 TimeSpan 值指定時間間隔,並指定是否在等待之前退出同步域。 |
| WaitAny(WaitHandle[]) |
等待指定數組中的任一元素收到信號。 |
| WaitAny(WaitHandle[], Int32) |
等待指定數組中的任意元素接收信號,同時使用 32 位有符號整數指定時間間隔。 |
| WaitAny(WaitHandle[], Int32, Boolean) |
等待指定數組中的任一元素收到信號,使用 32 位帶符號整數指定時間間隔並指定是否在等待之前退出同步域。 |
| WaitAny(WaitHandle[], TimeSpan) |
等待指定數組中的任意元素接收信號,同時使用 TimeSpan 指定時間間隔。 |
| WaitAny(WaitHandle[], TimeSpan, Boolean)
|
等待指定數組中的任一元素收到信號,使用 TimeSpan 指定時間間隔並指定是否在等待之前退出同步域。 |
| WaitOne() |
阻止當前線程,直到當前 WaitHandle 收到信號。 |
| WaitOne(Int32) |
阻止當前線程,直到當前 WaitHandle 收到信號,同時使用 32 位帶符號整數指定時間間隔(以毫秒為單位)。 |
| WaitOne(Int32, Boolean) |
阻止當前線程,直到當前的 WaitHandle 收到信號為止,同時使用 32 位帶符號整數指定時間間隔,並指定是否在等待之前退出同步域。 |
| WaitOne(TimeSpan) |
阻止當前線程,直到當前實例收到信號,同時使用 TimeSpan 指定時間間隔。 |
| WaitOne(TimeSpan, Boolean) |
阻止當前線程,直到當前實例收到信號為止,同時使用 TimeSpan 指定時間間隔,並指定是否在等待之前退出同步域。 |
3.示例代碼說明
static void trmain() { Thread tr = Thread.CurrentThread; Console.WriteLine("thread:wait for an event"); isTimeout = manual.WaitOne(new TimeSpan(0,0,5)); Console.WriteLine("thread : go an event "); } private static bool isTimeout; private static Stopwatch watch; private static System.Threading.Timer timer; static ManualResetEvent manual = new ManualResetEvent(true); public static void Main() { watch = new Stopwatch(); Timeout timeout = new Timeout(); watch.Start(); manual.Reset(); timer = new System.Threading.Timer((obj)=> { Console.WriteLine(string.Format("運行時間:{0}秒 當前等待結果:{1}", watch.Elapsed.TotalSeconds.ToString("F2"),isTimeout)); }, null, 0, 500); Thread thread = new Thread(new ThreadStart(trmain)); thread.Name = "線程名稱"; thread.Start(); System.Threading.Thread.Sleep(4000); manual.Set(); Console.WriteLine("*************************************"); Console.Read(); watch.Stop(); timer.Dispose(); }
測試結果截圖:
