System.Threading.CountdownEvent 是一個同步基元,它在收到一定次數的信號之后,將會解除對其等待線程的鎖定。 CountdownEvent 專門用於以下情況:您必須使用 ManualResetEvent 或 ManualResetEventSlim,並且必須在用信號通知事件之前手動遞減一個變量。 例如,在分叉/聯接方案中,您可以只創建一個信號計數為 5 的 CountdownEvent,然后在線程池上啟動五個工作項,並且讓每個工作項在完成時調用 Signal。 每次調用 Signal 時,信號計數都會遞減 1。 在主線程上,對 Wait 的調用將會阻塞,直至信號計數為零。
CountdownEvent 具有這些附加功能:
•可通過使用取消標記來取消等待操作。
•創建實例之后可以遞增它的信號計數。
•通過調用 Reset 方法,可在 Wait 返回之后重用實例。
•實例公開 WaitHandle 以便與其他 .NET Framework 同步 API(例如 WaitAll)進行集成。——MSDN
private void CountEventTest() { CountdownEvent count = new CountdownEvent(5);//創建5個數量 Task[] task = new Task[4]; count.Reset(4);//重置為4個數量 Action act = () => { MessageBox.Show("ok"); count.Signal();//通知已經有一個線程完成了 }; for (int i = 0; i < task.Length; ++i) { task[i] = new Task(act); task[i].Start(); } count.Wait();//等待4個線程都完成 MessageBox.Show("end"); }
簡單的說就是先設置多少個數量,然后Signal通知一個已經完成,Wait等待所有數量全部完成,則繼續往下運行
上述例子:先彈出4個OK,然后一個一個點掉,最后一個點掉的時候 彈出 end。
CountdownEvent 和 Barrier 非常接近類似
