System.Threading.CountdownEvent 是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定。CountdownEvent在初始化时有一个初始计数量,在每个工作项在完成时调用 Signal。每次调用Signal 时,信号计数都会递减 1。 在主线程上,对 Wait 的调用将会阻塞,直至信号计数为零。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 static void Main(string[] args) 2 { 3 CountdownEvent countdown = new CountdownEvent(3); 4 int taskid = 1; 5 for (var i = 0; i < 3; i++) 6 { 7 Task.Factory.StartNew(() => 8 { 9 int cur = taskid++; 10 Console.WriteLine($"Task[{cur}] is Running"); 11 Thread.Sleep(taskid * 1000); 12 countdown.Signal(); 13 Console.WriteLine($"Task[{cur}] exit"); 14 }); 15 } 16 Console.WriteLine($"Main wait"); 17 countdown.Wait(); 18 Console.WriteLine($"Main exit"); 19 Console.ReadKey(); 20 }
CountdownEvent 与Barrier类似,但是在多次等待中,使用Barrier更加方便。