CountDownEvent 信号类来等待直到一定数量的操作完成

 

 

当主程序启动时,创建一个 CountDownEvent 类的实例,在其构造函数中指定个数操作完成发出信号,当前为2个操作完成会发出信号。

 

 1 /// <summary>
 2         /// 创建 CountdownEvent 实例,指定达到次数为 2 次
 3         /// </summary>
 4         public static CountdownEvent _countdown = new CountdownEvent(2);
 5 
 6         /// <summary>
 7         /// 
 8         /// </summary>
 9         /// <param name="message">消息提示</param>
10         /// <param name="seconds">时间(秒)</param>
11         public static void PerformOperation(string message, int seconds)
12         {
13             System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));
14 
15             Console.WriteLine(message);
16 
17             _countdown.Signal();
18         }

 

一旦第二个线程完成,主线程会从等待 CountdownEvent 的状态中返回并继续执行。针对需要等到多个异步操作完成的情形,使用该方式非常便利。

 

 1 /// <summary>
 2         /// 输出
 3         /// </summary>
 4         public static void Print()
 5         {
 6             // Starting two operations
 7 
 8             var t1 = new System.Threading.Thread(() => PerformOperation("Operation 1 is completed", 4));
 9 
10             var t2 = new System.Threading.Thread(() => PerformOperation("Operation 2 is completed", 8));
11 
12             t1.Start();
13             t2.Start();
14 
15             // 如果 调用 _countdown.Signal() 没达到指定的次数
16             // 那么 _countdown.Signal() 将一直阻止,继续等待
17             _countdown.Wait();  // 阻止当前线程
18 
19             // Both operation have been completed
20             _countdown.Dispose();   // 释放资源
21         }

 

如果调用 _countdown.Signal() 没达到指定的次数 ,那么 _countdown.Signal() 将一直阻止,继续等待。请确保使用 CountDownEvent  时,所有线程完成后都要调用 Signal 方法。

 

posted @ 2019-09-06 02:15  刺激  阅读(533)  评论(0编辑  收藏  举报