ManualResetEvent使用


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();

        }

測試結果截圖:

                          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM