【C#】【Thread】CountdownEvent任務並行


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 非常接近類似



免責聲明!

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



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