【C#】【Thread】ManualResetEvent和AutoResetEvent区别

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阻塞线程,无需人为操作。

时间: 2024-08-06 20:06:09

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

ManualResetEvent和AutoResetEvent的区别

在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容,来做对比: ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程. 可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程.这个属性我们在初始化的时候可

C#多线程之二:ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法

C#多线程之 ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法

211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent

一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:BeginBeginRequest. 1: /// <summary> 2: /// 启动 System.Web.HttpApplication.BeginRequest 的异步处理的 System.Web.BeginEventHandler 3: /// System.Web.HttpApplic

C#中多线程信号控制ManualResetEvent和AutoResetEvent

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication22 { publ

对ManualResetEvent和AutoResetEvent的巩固练习

在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度是异步的操作,所以就涉及到线程同步问题,所以针对这个对ManualResetEvent和AutoResetEvent两个信号量巩固练习一下. 1 class Program 2 { 3 static ManualResetEvent _ManualResetEvent = new ManualRes

Thread 和Runnable的区别

Thread 和Runnable 的区别 Thread类 在java中可有两种方法实现度线程,一种是继承Thread类,一种是实现Runnable接口.Thread类是在java.lang包中定义的.一个类只要继承了Thread类,并覆写了本类的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这就是此方法的局限性. 但是,此时结果很有规律,先是第一个对象执行,然后第二个对象执行,并没有相互运行.在JDK的文档中可以发现,一旦调用start()方法.下面启动start()方法启动

Thread和Runable的区别、Synchronized锁关键字

一.Thread和Runable的区别 Thread是基类,子类必继承他实现其run方法.其也是实现了Runable接口.Thread是普通的类,并非抽象类或者密封类等. Runnable是接口,子类必须实现run方法,该接口就只有唯一的抽象方法run. 由于Java单继承,所以Thead通过类继承方式实现接口,存在扩展性问题. 他们都是通过start方法来启动,可以达到异步操作,如果用run方法启动其将是同步方法,失去多线程的意义. Runnable,的实现类可以实现资源共享,多个调用只需要实

【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17161237 Java中实现多线程有两种方法:继承Thread类.实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势: 1.可以避免由于Java的单继承特性而带来的局限: 2.增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的: 3.适合多个相同程序代码的线程区处理同一资源的情