EventWaitHandle 自己的小結


   一直對於實例化EventWaitHandle對象是后傳入是否為終止狀態,手動或者自動的情況不是很清楚,所以,研究了一下做個筆記。

  EventWaitHandle各個線程程之間互通信號。

 首先:如果事件初始為終止狀態,首次waitone()時候不進行線程阻塞,為非終止狀態時候,首次waitone()時候進行線程阻塞。當然,該狀態也要結合一下的EventResetMode的值進行結合使用。

 EventResetMode.AutoReset 自動重置,也就是自動重置事件狀態,自動的話,他會在首次waitone之后立即改變事件為非終止狀態。就像這樣{如果手動重置事件的初始化為終止狀態,則首次waitone()不進行線程阻塞,但是會立即改變事件狀態的狀態為非終止狀態,當以后waitone()的時候,都會阻塞線程}

EventResetMode.ManualReset 手動重置,它對於線程的阻塞決定於上一個參數是否為終止狀態,也就是說,如果初始值設置為終止狀態,則它的線程如果不手動進行手動設置,則一直不進行線程阻塞,如果初始值是非終止狀態,則每個waione()都會阻塞,除非手動使用set()之類的方法設置為終止狀態為止。

下面貼出代碼示例:

    class Program
    {
        //static EventWaitHandle wait = new EventWaitHandle(true, EventResetMode.AutoReset);  //自動  中止狀態
        
        static EventWaitHandle waitM = new EventWaitHandle(false, EventResetMode.ManualReset);//手動   非終止狀態
        static void Main(string[] args)
        {
            Console.WriteLine("1當前時間" + DateTime.Now);
            Thread thread = new Thread(S);
            thread.Start();

            Thread.Sleep(3000);
            //wait.Set();//將狀態設置為終止狀態。
            waitM.Set();   //將狀態設置為終止狀態。
            Console.Read();
        }
        public static void S()
        {
            waitM.WaitOne(3000);   //非終止狀態,無限制阻塞線程,不自動改變事件的終止狀態
           //wait.WaitOne();  //自動返回為終止狀態,不阻塞線程,為同一時間
            Console.WriteLine("2當前時間" + DateTime.Now);

           waitM.WaitOne(3000);  //前面的set()將事件手動終止狀態,不進行阻塞
           //  wait.WaitOne(3000);  //此時為非終止狀態,停頓三秒
            Console.WriteLine("3當前時間" + DateTime.Now);

        }
    }

 

  


免責聲明!

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



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