.NET中的ManualResetEvent和AutoResetEvent有什么区别?
我已经阅读了有关此文档,并且我理解。当代码通过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有时用于表示特定操作已完成,或者线程已完成初始化并准备执行工作。