.NET中的ManualResetEvent和AutoResetEvent有什么区别?

时间:2020-03-06 14:55:59  来源:igfitidea点击:

我已经阅读了有关此文档,并且我理解。当代码通过event.WaitOne()时,AutoResetEvent会重置,而ManualResetEvent不会。

这样对吗?

解决方案

简短的答案是肯定的。最重要的区别是,AutoResetEvent将仅允许一个等待线程继续。另一方面,ManualResetEvent将继续允许线程(甚至同时包含多个线程)继续运行,直到我们告诉它停止(重置)为止。

是的。就像收费站和门之间的区别一样。 " ManualResetEvent"是门,需要手动关闭(重置)。 AutoResetEvent是收费站,允许一辆车经过并自动关闭,直到下一辆车通过。

是的。这是绝对正确的。

我们可能会看到ManualResetEvent作为指示状态的一种方式。某些东西打开(设置)或者关闭(重置)。具有一定持续时间的事件。等待该状态发生的任何线程都可以继续。

AutoResetEvent与信号更具可比性。一枪表明发生了什么事。没有持续时间的事件。通常但并非必须如此,已发生的"事情"很小,需要由单个线程处理,因此在单个线程消耗完事件后自动重置。

试想一下," AutoResetEvent"将" WaitOne()"和" Reset()"作为单个原子操作执行。

Taken from C# 3.0 Nutshell book, by
  Joseph Albahari

CFree电子书中的线程

ManualResetEvent是AutoResetEvent的变体。它的不同之处在于,它在等待WaitOne调用通过某个线程后不会自动重置,因此其功能类似于Gate:调用Set将打开Gate,从而允许WaitOne处的任意数量的线程通过Gate;调用Reset会关闭门,有可能导致服务员队列累积,直到下一次打开为止。

可以使用布尔" gateOpen"字段(使用volatile关键字声明)与" spin-sleeping"重复检查标志,然后休眠一小段时间来模拟此功能。

ManualResetEvents有时用于表示特定操作已完成,或者线程已完成初始化并准备执行工作。