AutoResetEvent和ManualResetEvent
代码片段1:
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start();
Thread.Sleep(3000);
_autoResetEvent.Set();
}
void Thread1Foo()
{
_autoResetEvent.WaitOne();
MessageBox.Show("t1 end");
}
这段代码的执行结果,就是3秒钟过后,弹出“t1 end”。
而如果把:
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
改为:
AutoResetEvent _autoResetEvent = new AutoResetEvent(true);
则“t1 end”将会立刻弹出。
也就是说,在终止状态中,_autoResetEvent.WaitOne()是不会起到阻滞工作线程的作用的。(PS:ManualResetEvent也同样)
二:AutoResetEvent和ManualResetEvent的区别
接下来,再来看看AutoResetEvent和ManualResetEvent的区别。我们看代码段2和代码段3:
代码段2:
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start();
Thread t2 = new Thread(this.Thread2Foo);
t2.Start();
Thread.Sleep(3000);
_autoResetEvent.Set();
}
void Thread1Foo()
{
_autoResetEvent.WaitOne();
MessageBox.Show("t1 end");
}
void Thread2Foo()
{
_autoResetEvent.WaitOne();
MessageBox.Show("t2 end");
}
该段代码运行的效果是,过3秒后,要么弹出“t1 end”,要么弹出“t2 end”,不会两个都弹出。也就是说,其中一个进行将会结束,而另一个进程永远不会结束。
代码段3:
ManualResetEvent _menuRestEvent = new ManualResetEvent(false);
private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start();
Thread t2 = new Thread(this.Thread2Foo);
t2.Start();
Thread.Sleep(3000);
_menuRestEvent.Set();
}
void Thread1Foo()
{
_menuRestEvent.WaitOne();
MessageBox.Show("t1 end");
}
void Thread2Foo()
{
_menuRestEvent.WaitOne();
MessageBox.Show("t2 end");
}
该段代码运行的效果是,过3秒后,“t1 end”和“t2 end”,两个都被弹出。也就是说,两个进程都结束了。
这个特性就是说,AutoResetEvent只会给一个线程发送信号,而不会给多个线程发送信号。在我们需要同步多个线程的时候,就只能采用ManualResetEvent了。至于深层次的原因是,AutoResetEvent在set()之后,会将线程状态自动置为false,而ManualResetEvent在Set()后,线程的状态就变为true了,必须手动ReSet()之后,才会重新将线程置为false。这也就是为什么他们的名字一个为Auto,一个为Manual的原因。为了更加充分的验证ManualResetEvent的这点特性,我们再来看代码片段4
代码片段4:
ManualResetEvent _menuRestEvent = new ManualResetEvent(false);
private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start();
Thread t2 = new Thread(this.Thread2Foo);
t2.Start();
Thread.Sleep(3000);
_menuRestEvent.Set();
//_menuRestEvent.Reset();
}
void Thread1Foo()
{
_menuRestEvent.WaitOne();
MessageBox.Show("t1 step1 end");
//睡1S,用于等待主线程_menuRestEvent.Reset();
Thread.Sleep(1000);
_menuRestEvent.WaitOne();
MessageBox.Show("t1 step2 end");
}
void Thread2Foo()
{
_menuRestEvent.WaitOne();
MessageBox.Show("t2 step1 end");
//睡1S,用于等待主线程_menuRestEvent.Reset();
Thread.Sleep(1000);
_menuRestEvent.WaitOne();
MessageBox.Show("t2 step2 end");
}
在代码片段4中,我们对//_menuRestEvent.Reset()进行了注释,也就是说, _menuRestEvent.Set()后,线程的状态就是true状态的,程序运行的结果是"t1 step1 end"、"t1 step2 end"、"t1 step2 end"、"t2 step2 end"在3秒之后全部弹出。
而如果我们将//_menuRestEvent.Reset()的注释去掉,会发现"t1 step2 end"和"t2 step2 end"永远不会弹出。除非我们在主线程中再次对_menuRestEvent进行Set()。
转载于:https://www.cnblogs.com/kevinGao/archive/2012/04/13/2482119.html
AutoResetEvent和ManualResetEvent相关推荐
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析
AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...
- 关于AutoResetEvent 和ManualResetEvent
在公司的代码里面看到这两个类的使用了,第一次去msdn上的时候,看的一头雾水(关键是没有找对方法) http://www.cnblogs.com/qingyun163/archive/2013/01/ ...
- c# AutoResetEvent和ManualResetEvent
网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...
- AutoResetEvent 与 ManualResetEvent
闲来无事,把AutoResetEvent 与 ManualResetEvent 两个Event进行了一下实践Demo,毕竟以后会遇到多线程的开发问题,现在有时间把它们好好的先试验一下,这样印象会更深刻 ...
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...
- 对AutoResetEvent和ManualResetEvent的理解
一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非 ...
- AutoResetEvent与ManualResetEvent区别
在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态 ...
- 个人对AutoResetEvent和ManualResetEvent的理解
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...
- 【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...
AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...
最新文章
- AndoridSQLite数据库开发基础教程(6)
- MAVEN的使用入门
- postfix+mysql 发件服务
- 【IMPDP】当导入数据时遭遇表已存时的应对手段——TABLE_EXISTS_ACTION参数
- HDU 3966 Aragorn's Story (树链点权剖分,成段修改单点查询)
- 【Elasticsearch】es 各种 日志 慢日志 慢查询
- 如何用hypermesh生成包含interface的流体网格
- 深度学习之神经网络(一)
- 完全卸载MySQL 数据库——清空MySql注册表
- eclipse的Windows builder使用。
- 多比特杯第四届ACM程序设计竞赛同步赛
- 都2022年了,这11个Java开发工具你还不知道?
- 一寸照片电子版怎么弄?电子证件照制作方法
- android 仿小米相机,android-自定义相机遇小米3生成图片花屏
- go cobra初试
- jquery 将下拉框重置_select下拉框之默认选项清空
- 两个数学家的问题,“你不知道我不知道你知道我知道”
- 【数学】《离散数学中“群”的概念》
- switch写打折促销活动C语言,求C语言大神编一个程序(分别用switch和if-else结构)某商店推出打折活动,要求购物达到或超过2000元的...
- ArcGIS、Super、MapMapInfo…
热门文章
- 如何用我python抓取关键字新闻_用python机器学习实现新闻关键词的抽取
- catia过载属性使用方法_catia简明操作手册
- mysql8jdbc连接串_mysql8 JDBC连接注意事项
- Java后端向前端传递数据,挥泪整理面经
- 【微信小程序企业级开发教程】页面的生命周期和参数传递
- oracle数据库的高可用r,Oracle高可用之dataguard
- mysql查询的题目_mysql查询语句练习题
- python字典生成式_【IT专家】Python 简化for循环:列表,集合与字典生成式
- 10台客户机打印机文件服务器,Sever-U实现局域网打印机安全共享.doc
- 东莞网络推广浅析网站优化中常见的引流方式有哪些?