前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 线程同步之事件信号阻塞 AutoResetEvent

C# 线程同步之事件信号阻塞 AutoResetEvent

作者头像
喝茶去
发布2020-09-07 15:52:08
2K0
发布2020-09-07 15:52:08
举报
文章被收录于专栏:知识累积知识累积

AutoResetEvent可以在线程与线程间传递信号,来告知其他线程自己已经完成某一阶段的任务。

两个AutoResetEvent实例的初始状态都是unsignaled。 调用任何一个WaitOne都会阻塞,直到Set。

如果初始状态(new时给了true)为Signaled,则WaitOne会立刻执行,然后自动切换回unsignaled

AutoResetEvent采用内核时间模式,等待时间不能太长。 这能被更好的ManualResetEventslim类替换,因为它是混合模式。

下方输出结果:

1等待另一个线程完成工作 2开始一个长期工作 3工作完成 4等待中线程完成它的工作 5第一阶段工作完成 6在主线程上做了些操作 7现在开始由第二线程执行第二阶段 8开始第二阶段 9工作完成 10工作全部完成

代码语言:javascript
复制
private static AutoResetEvent _workerEvent = new AutoResetEvent(false);

       private static AutoResetEvent _mainEvent = new AutoResetEvent(false);

       static void Process(int seconds)
       {
           Console.WriteLine("2开始一个长期工作");
           Thread.Sleep(seconds);
           Console.WriteLine("3工作完成");
           Console.WriteLine("4等待中线程完成它的工作");
           _workerEvent.Set();
           _mainEvent.WaitOne();
           Console.WriteLine("8开始第二阶段");
           Thread.Sleep(seconds);
           Console.WriteLine("9工作完成");
           _workerEvent.Set();
       }

       static void Main(string[] args)
       {
           var t = new Thread(() => Process(10));
           t.Start();

           Console.WriteLine("1等待另一个线程完成工作");
           _workerEvent.WaitOne();

           Console.WriteLine("5第一阶段工作完成");
           Console.WriteLine("6在主线程上做了些操作");
           Thread.Sleep(5);
           Console.WriteLine("7现在开始由第二线程执行第二阶段");
           _mainEvent.Set();
           _workerEvent.WaitOne();
           Console.WriteLine("10工作全部完成");

           Console.ReadLine();
       }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档