CountdownEvent是一種同步結構,主要用來協調多種同步處理後的結果場景使用。其含義為:定義一個多訊號的結構,然後在應用時判斷訊號是否全部到達,如果全部到達則繼續往下執行,否則進行阻塞,有意思的是,如果阻塞已過,那麼再次執行到wait()時,執行緒是不會再次阻塞的,除非呼叫reset()重新初始化後才可以。這點和其餘的同步結構不一樣。
示例如下:
internal class Program { static CountdownEvent e = new CountdownEvent(3); static bool isOutput = true; static int i = 0; static void Main(string[] args) { Thread t = new Thread(ProcessData); t.Start(); Console.WriteLine("啟動"); i++; Console.WriteLine("訊號1已到"); e.Signal(); Console.WriteLine("訊號2已到"); e.Signal(); Console.WriteLine("訊號3已到"); e.Signal(); Console.ReadLine(); i++; Console.WriteLine("訊號1又到"); e.Signal(); Console.WriteLine("訊號2又到"); e.Signal(); Console.WriteLine("訊號3又到"); e.Signal(); Console.ReadKey(); } static void ProcessData() { while (isOutput) { Console.WriteLine("阻塞等待訊號"); e.Wait(); Console.WriteLine("阻塞已過,處理:Processed {0}", i); e.Reset(); if (i > 1) { isOutput = false; } } if (!isOutput) { e.Dispose(); Console.WriteLine("處理完成"); } } }
執行結果: