一直對於實例化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); } }