首页 > 代码库 > 【C#】【Thread】CountdownEvent任务并行
【C#】【Thread】CountdownEvent任务并行
System.Threading.CountdownEvent 是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定。 CountdownEvent 专门用于以下情况:您必须使用 ManualResetEvent 或 ManualResetEventSlim,并且必须在用信号通知事件之前手动递减一个变量。 例如,在分叉/联接方案中,您可以只创建一个信号计数为 5 的 CountdownEvent,然后在线程池上启动五个工作项,并且让每个工作项在完成时调用 Signal。 每次调用 Signal 时,信号计数都会递减 1。 在主线程上,对 Wait 的调用将会阻塞,直至信号计数为零。
CountdownEvent 具有这些附加功能:
?可通过使用取消标记来取消等待操作。
?创建实例之后可以递增它的信号计数。
?通过调用 Reset 方法,可在 Wait 返回之后重用实例。
?实例公开 WaitHandle 以便与其他 .NET Framework 同步 API(例如 WaitAll)进行集成。——MSDN
private void CountEventTest() { CountdownEvent count = new CountdownEvent(5);//创建5个数量 Task[] task = new Task[4]; count.Reset(4);//重置为4个数量 Action act = () => { MessageBox.Show("ok"); count.Signal();//通知已经有一个线程完成了 }; for (int i = 0; i < task.Length; ++i) { task[i] = new Task(act); task[i].Start(); } count.Wait();//等待4个线程都完成 MessageBox.Show("end"); }
简单的说就是先设置多少个数量,然后Signal通知一个已经完成,Wait等待所有数量全部完成,则继续往下运行
上述例子:先弹出4个OK,然后一个一个点掉,最后一个点掉的时候 弹出 end。
CountdownEvent 和 Barrier 非常接近类似
【C#】【Thread】CountdownEvent任务并行
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。