首先说说线程的终止状态和非终止状态。AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态。true表示终止状态,false表示非终止状态。看代码片段1:

代码片段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相关推荐

  1. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  2. 关于AutoResetEvent 和ManualResetEvent

    在公司的代码里面看到这两个类的使用了,第一次去msdn上的时候,看的一头雾水(关键是没有找对方法) http://www.cnblogs.com/qingyun163/archive/2013/01/ ...

  3. c# AutoResetEvent和ManualResetEvent

    网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...

  4. AutoResetEvent 与 ManualResetEvent

    闲来无事,把AutoResetEvent 与 ManualResetEvent 两个Event进行了一下实践Demo,毕竟以后会遇到多线程的开发问题,现在有时间把它们好好的先试验一下,这样印象会更深刻 ...

  5. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  6. 对AutoResetEvent和ManualResetEvent的理解

    一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非 ...

  7. AutoResetEvent与ManualResetEvent区别

    在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态 ...

  8. 个人对AutoResetEvent和ManualResetEvent的理解

    仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...

  9. 【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...

    AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...

最新文章

  1. AndoridSQLite数据库开发基础教程(6)
  2. MAVEN的使用入门
  3. postfix+mysql 发件服务
  4. 【IMPDP】当导入数据时遭遇表已存时的应对手段——TABLE_EXISTS_ACTION参数
  5. HDU 3966 Aragorn's Story (树链点权剖分,成段修改单点查询)
  6. 【Elasticsearch】es 各种 日志 慢日志 慢查询
  7. 如何用hypermesh生成包含interface的流体网格
  8. 深度学习之神经网络(一)
  9. 完全卸载MySQL 数据库——清空MySql注册表
  10. eclipse的Windows builder使用。
  11. 多比特杯第四届ACM程序设计竞赛同步赛
  12. 都2022年了,这11个Java开发工具你还不知道?
  13. 一寸照片电子版怎么弄?电子证件照制作方法
  14. android 仿小米相机,android-自定义相机遇小米3生成图片花屏
  15. go cobra初试
  16. jquery 将下拉框重置_select下拉框之默认选项清空
  17. 两个数学家的问题,“你不知道我不知道你知道我知道”
  18. 【数学】《离散数学中“群”的概念》
  19. switch写打折促销活动C语言,求C语言大神编一个程序(分别用switch和if-else结构)某商店推出打折活动,要求购物达到或超过2000元的...
  20. ArcGIS、Super、MapMapInfo…

热门文章

  1. 如何用我python抓取关键字新闻_用python机器学习实现新闻关键词的抽取
  2. catia过载属性使用方法_catia简明操作手册
  3. mysql8jdbc连接串_mysql8 JDBC连接注意事项
  4. Java后端向前端传递数据,挥泪整理面经
  5. 【微信小程序企业级开发教程】页面的生命周期和参数传递
  6. oracle数据库的高可用r,Oracle高可用之dataguard
  7. mysql查询的题目_mysql查询语句练习题
  8. python字典生成式_【IT专家】Python 简化for循环:列表,集合与字典生成式
  9. 10台客户机打印机文件服务器,Sever-U实现局域网打印机安全共享.doc
  10. 东莞网络推广浅析网站优化中常见的引流方式有哪些?