【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 非常接近类似


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值