ManualResetEvent和AutoResetEvent主要用于线程之间同步问题。

主要使用方法有Set();Reset();WaitOne();

Set():将事件状态设置为终止状态,允许一个或多个等待线程继续。也就是说是结束状态,这个时候可以运行。

Reset():将事件状态设置为非终止状态,导致线程阻止。也就是说是在运行状态,这个时候WaitOne()位置会等待,阻塞。

WaitOne():阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。就是当前线程会等在WaitOne这个位置直到某个位置调用了Set()。

ManualResetEvent manualEvent = new ManualResetEvent(false);

AutoResetEvent autoEvent = new AutoResetEvent(false);

两个构造函数都有一个bool值参数:

true表示终止状态,即类似内部帮你调用了Set();

false表示非终止状态,即类似内部帮你调用了Reset();

以上为共同点,接下去说一下不同点。

经过网上查阅资料,以及自己测试的结果,本人认为主要区别在于WaitOne();方法上。

manualEvent.WaitOne();不会做处理,只是阻塞线程作用。

autoEvent.WaitOne();会重新把autoEvent设置为非终止状态,也就是说内部可能会调用Reset();

所以呢区别就是:

manualEvent.Set();解放线程之后,所有的WaitOne都不会再阻塞。需要手动Reset();才能再次阻塞。

autoEvent.Set();解放线程之后,第一个WaitOne执行下去,第二个WaitOne开始又会阻塞,需要再次Set();解放阻塞。

换言之:ManualResetEvent 需要手动Reset进行阻塞线程,AutoResetEvent 每次WaitOne后自动Reset阻塞线程,无需人为操作。

PS.WaitHandle的使用

System.Threading.WaitHandle.WaitOne 使线程一直等待,直到单个事件变为终止状态;

System.Threading.WaitHandle.WaitAny 阻止线程,直到一个或多个指示的事件变为终止状态;

System.Threading.WaitHandle.WaitAll 阻止线程,直到所有指示的事件都变为终止状态。

【C#】【Thread】ManualResetEvent和AutoResetEvent区别的更多相关文章

  1. ManualResetEvent和AutoResetEvent的区别

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  2. ManualResetEvent和AutoResetEvent的区别,分享来的

    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...

  3. ManualResetEvent和AutoResetEvent的区别实例

    ManualResetEvent和AutoResetEvent的作用可以理解为在线程执行中插入停顿点flag终止程序运行,然后通过设置flag的状态来使得程序继续运行. 两者的区别是:ManualRe ...

  4. C# ManualResetEvent和AutoResetEvent 使用笔记

    一.两者区别 1.ManualResetEvent 调用一次Set()后将允许恢复所有被阻塞线程.需手动在调用WaitOne()之后调用Reset()重置信号量状态为非终止,然后再次调用WaitOne ...

  5. C#多线程之二:ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  6. 211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent

    一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:B ...

  7. C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用

    1.简介 虽然ThreadPool.Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常.或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它 ...

  8. C#多线程之 ManualResetEvent和AutoResetEvent

    初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...

  9. 对ManualResetEvent和AutoResetEvent的巩固练习

    在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度 ...

随机推荐

  1. SharePoint 门户添加内网域名

    原理:在DNS服务器上,添加一条SharePoint门户所在主机的别名,当我们在浏览器里访问这个别名的时候,会自动到Dns去解析,解析出来这台主机,从而访问到我们的SharePoint门户. 1.打开 ...

  2. 使用Reflexil修改类库

    因为公司一个项目需要修改PPS的颜色,于是反编译了PPS的代码发现,作者很不厚道的把所有着色都HardCode在代码里 private static void InsertDefaultSeriesC ...

  3. 安卓开发_浅谈SubMenu(子菜单)

    子菜单,即点击菜单后出现一个菜单栏供选择 创建子菜单的步骤: (1) 覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单 (2 ...

  4. JavaWeb开发必过关-Servlet学习(一)

    一.什么是Servlet servlet其实是一个小程序,它是运行在服务器上的,一个servlet就是一个Java类,可以通过"请求-响应"编程模型来访问这个驻留在服务器内存的Se ...

  5. SSH整合简述一

    1.web.xml中配置 struts2过滤器 <filter> <filter-name>struts2</filter-name> <filter-cla ...

  6. 【转】一个非常常见但容易被忽略的c++问题——用IPML模式可以解决

    pimpl (the pointer-to-implementation idiom)手法在 C++ 里已是“高手”们广泛运用的成熟方法之一,它的优点很多,诸如降低编译依赖.提高重编译速度之类的工具性 ...

  7. Mac下安装Django

    用到一个Python写的后台服务,需要用到Django,参考Django安装文档,配置过程如下: 1.下载一个用来安装和管理Python包的工具“pip”; 2.下载完成后,运行安装脚本,注意需要管理 ...

  8. Resharper注册机实现以及源代码

    一直用Resharper,每次找注册机也麻烦,就想怎么才能自己能做个注册机,把它原理给搞懂了,不就不用找了.今天早上起来研究了下Resharper注册机,网上找到一位大神之前做Resharper注册机 ...

  9. 同域iframe的高度自适应

    引子 父页面里控制子页面 子页面里控制父页面 一.引子 我们先看一个示例,有两个页面,1.html通过iframe嵌入2.html,两个页面都是同域的 1.html <!DOCTYPE html ...

  10. ruby 删除文件

    f = "app/assets/#{vm.uuid}.rrd" if FileTest::exist?(f) File.delete(f) end