C#AutoResetEvent和ManualResetEvent的区别

如题所述

一:终止状态与非终止状态

AutoResetEvent与ManualResetEvent在构造函数中均包含一个bool变量,用于表示线程的终止状态与非终止状态。设置为true表示线程处于终止状态,false表示非终止状态。以代码片段1为例,这段代码在3秒后输出“t1 end”。若将代码片段1中的true改为false,则会立即输出“t1 end”。在终止状态中,无论调用WaitOne()方法,工作线程都不会被阻滞。(注:ManualResetEvent同样适用)

二:AutoResetEvent与ManualResetEvent的差异

接下来,让我们深入理解AutoResetEvent与ManualResetEvent的差异。以代码段2与代码段3为例。代码段2在3秒后只会输出“t1 end”或“t2 end”之一,表明其中一个进程结束,另一个进程持续运行。而代码段3在3秒后输出“t1 end”与“t2 end”,表示两个进程均已完成。由此可见,AutoResetEvent仅向一个线程发送信号,无法同步多个线程。在需要同步多个线程时,应使用ManualResetEvent。从AutoResetEvent在set()后自动将线程状态置为false,而ManualResetEvent在Set()后线程状态变为true,需手动ReSet()才能恢复为false的特性,可理解为两者名称中“Auto”与“Manual”的来源。为了验证ManualResetEvent的特性,我们继续分析代码片段4。

代码片段4中,我们去除了//_menuRestEvent.Reset()的注释,即在Set()后线程状态为true。执行结果为“t1 step1 end”、“t1 step2 end”、“t1 step2 end”、“t2 step2 end”在3秒后全部输出。若保留该注释,将发现“t1 step2 end”与“t2 step2 end”永远不会输出,除非在主线程中再次调用Set()方法。
温馨提示:内容为网友见解,仅供参考
无其他回答

C#AutoResetEvent和ManualResetEvent的区别
由此可见,AutoResetEvent仅向一个线程发送信号,无法同步多个线程。在需要同步多个线程时,应使用ManualResetEvent。从AutoResetEvent在set()后自动将线程状态置为false,而ManualResetEvent在Set()后线程状态变为true,需手动ReSet()才能恢复为false的特性,可理解为两者名称中“Auto”与“Manual”的来源。为...

C#AutoResetEvent和ManualResetEvent的区别
C#中的AutoResetEvent和ManualResetEvent用于实现线程同步。其基本工作原理是多个线程持有同一个XXXResetEvent,在这个XXXResetEvent未被set前,各线程都在WaitOne()除挂起;在这个XXXResetEvent被set后,所有被挂起的线程中有一个(AutoResetEvent的情况下)或全部(ManualResetEvent的情况下)恢复执行。 AutoResetEvent与ManualReset...

c#线程学习之ManualResetEvent和AutoResetEvent的区别
2. 需要运行停等待主线程指令使用ManualResetEventManualResetEvent 允许线程通发信号互相通信通通信涉及线程其线程进行前必须完任务 线程始(必须完其线程才能始)调用 Reset ManualResetEvent 置于非终止状态线程视控制 ManualResetEvent调用 ManualResetEvent WaitOne 线程阻止并等待信号控制线程完调用 Set 发等待...

c#线程学习之ManualResetEvent和AutoResetEvent的区别
ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程。可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程。这个属性我们在初始化的时候可以设置它,如ManualResetEvent event=new ManualResetEvent(false);这就表明默认...

c#线程学习之ManualResetEvent和AutoResetEvent的区别
AutoResetEvent在被Wait并成功返回后会自动Reset,代表这个信号已经被占用了 而ManualResetEvent要手动调用Reset()

C#AutoResetEvent和ManualResetEvent的区别
manual的话肯定会给线程1和线程2都发送一个信号,而auto只会随机给其中一个发送信号。

c#线程学习之ManualResetEvent和AutoResetEvent的区别
_manualResetEvent .Set(); \/\/想象成将IsRelease设为True ——。相对的 .reset()则设置成False;} void Thread1Foo(){ _manualResetEvent .WaitOne();\/\/阻塞线程1,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,\/\/这时不再阻塞线程1,程序继续往下跑 MessageBox.Show...

多线程(.net)
AutoResetEvent 一次只唤醒一个线程,而 ManualResetEvent 可以唤醒多个线程。 AutoResetEvent.WaitOne() 每次只允许一个线程进入,当某个线程得到信号后, AutoResetEvent 会自动将信号设置为不发送状态, 其他调用 WaitOne 的线程只有继续等待. 当某个线程调用了ManualResetEvent.Set() 方法后,除非手工...

C#中几种同步的方法
同步事件有两种:AutoResetEvent和 ManualResetEvent。它们之间唯一不同的地方就是在激活线程之后,状态是否自动由终止变为非终止。AutoResetEvent自动变为非终止,就是说一个 AutoResetEvent只能激活一个线程。而ManualResetEvent要等到它的Reset方法被调用,状态才变为非终止,在这之前,ManualResetEvent可以激活任意多个线程。

C# AutoResetEvent的使用
AutoResetEvent与ManualResetEvent的区别 他们的用法\\声明都很类似,Set方法将信号置为发送状态 Reset方法将信号置为不发送状态WaitOne等待信号的发送。其实,从名字就可以看出一个手动,一个自动,这个手动和自动实际指的是在Reset方法的处理上,如下面例子:public AutoResetEvent autoevent=new AutoResetEvent(...

相似回答
大家正在搜