EventWaitHandle 類用於在異步操作時控制線程間的同步,即控制一個或多個線程繼行或者等待其他線程完成。
構造函數
EventWaitHandle(bool initialState, EventResetMode mode);
initialState設置初始狀態,如果為true,則WaitOne()在調用Reset()方法前不會阻塞線程,先調用Reset()再調用WaitOne()會阻塞WaitOne()所在線程;如果設置為false,則WaitOne()會阻塞,直到調用Set()
mode設置為EventResetMode.ManualReset,在調用Set()時所有WaitOne()阻塞線程都會繼續執行;設置為EventResetMode.AutoReset則每次調用Set()會使一個WaitOne()阻塞的線程繼續執行,一般按照阻塞先后順序執行
上一個例子
using System; using System.Threading; namespace ConsoleApp1 { class Program { private int n1, n2, n3; //將信號狀態設置為非終止 EventWaitHandle myEventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset); static void Main(string[] args) { Program p = new Program(); Thread t0 = new Thread(new ThreadStart(p.WriteThread)); Thread t1 = new Thread(new ThreadStart(p.ReadThread1)); Thread t2 = new Thread(new ThreadStart(p.ReadThread2)); t0.Start(); t1.Start(); t2.Start(); Console.ReadLine(); } private void WriteThread() { //允許其他需要等待的線程阻塞 myEventWaitHandle.Reset(); Console.WriteLine("t1"); n1 = 1; n2 = 2; n3 = 3; //允許其他等待線程繼續 myEventWaitHandle.Set(); } private void ReadThread1() { //堵塞當前線程,知道收到信號 myEventWaitHandle.WaitOne(); Console.WriteLine("{0}+{1}+{2}={3}", n1, n2, n3, n1 + n2 + n3); } private void ReadThread2() { //堵塞當前線程,知道收到信號 myEventWaitHandle.WaitOne(); Console.WriteLine("{0}+{1}+{2}={3}", n3, n2, n1, 2*(n1 + n2 + n3)); } } }
執行結果