CountdownEvent,该类包含一个需要被初始化的计数器数字,如果该计数器数字归零之后,就会释放被阻塞的线程。
CountdownEvent.Signal()执行后,计数器会自减1;
CountdownEvent.Wait()执行后,如果计数器归零,则会立即释放该线程;否则,就会阻塞当前线程。
代码如下:
//初始化CountdownEvent,并将计数器数字初始化为2,即执行2次CountdownEvent.Signal()后,才释放被CountdownEvent.Wait()阻塞的线程 static CountdownEvent countdownEvent = new CountdownEvent(2); static void WorkOnCountdownEvent(string threadName) { Console.WriteLine($"{threadName} 正在等待中..."); Console.WriteLine($"{threadName} 执行中..."); Thread.Sleep(1000); Console.WriteLine($"{threadName} 执行完毕!"); if(countdownEvent.CurrentCount>0) countdownEvent.Signal(); Console.WriteLine($"{threadName} CountdownEvent'count={countdownEvent.CurrentCount}"); }
Main方法中的代码如下所示:
for (int i = 0; i < 2; i++) { string threadName = $"thread_{i}"; var thread = new Thread(delegate () { WorkOnCountdownEvent(threadName); }); thread.Start(); } countdownEvent.Wait(); Console.WriteLine("主线程 执行完毕!");
结果如下所示:
正如结果所示,当CountdownEvent.CurrentCount归零时,被阻塞的主线程才会被释放并继续执行。
CountdownEvent的功能不止如此,具体详参:https://docs.microsoft.com/zh-cn/dotnet/standard/threading/countdownevent