当主程序启动时,创建一个 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 方法。