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

 posted on 2020-10-22 10:01  F风  阅读(300)  评论(0编辑  收藏  举报