我已经阅读了关于这方面的文档,我想我明白了。AutoResetEvent在代码通过event.WaitOne()时重置,但ManualResetEvent不会。
这对吗?
我已经阅读了关于这方面的文档,我想我明白了。AutoResetEvent在代码通过event.WaitOne()时重置,但ManualResetEvent不会。
这对吗?
当前回答
是的,没错。
你可以通过这两者的用法得到一个概念。
如果你需要告诉别人你已经完成了一些工作,其他(线程)可以继续等待,你应该使用ManualResetEvent。
如果需要对任何资源进行互斥访问,则应该使用AutoResetEvent。
其他回答
autoResetEvent.WaitOne ()
类似于
try
{
manualResetEvent.WaitOne();
}
finally
{
manualResetEvent.Reset();
}
作为原子操作
是的,没错。
你可以通过这两者的用法得到一个概念。
如果你需要告诉别人你已经完成了一些工作,其他(线程)可以继续等待,你应该使用ManualResetEvent。
如果需要对任何资源进行互斥访问,则应该使用AutoResetEvent。
摘自c# 3.0果壳书,由 约瑟夫Albahari
c#线程-免费电子书
ManualResetEvent是AutoResetEvent的变体。它的不同之处在于它不会在线程通过WaitOne调用后自动重置,因此功能类似于gate:调用Set打开gate,允许WaitOne在gate处通过任意数量的线程;调用Reset会关闭大门,可能会导致排队等候的人越来越多,直到下一个门被打开。
可以使用布尔值“gateOpen”字段(使用volatile关键字声明)结合“spin-sleep”来模拟此功能——重复检查标志,然后小睡一小段时间。
ManualResetEvents有时用于表示特定操作已完成,或线程已完成初始化并准备执行工作。
是的。这是绝对正确的。
您可以将ManualResetEvent视为指示状态的一种方式。某些东西打开(设置)或关闭(重置)。有一定持续时间的事件任何等待该状态发生的线程都可以继续。
AutoResetEvent更类似于信号。这是发生了什么事的一个迹象。没有任何持续时间的事件。通常情况下(但不一定)发生的“事情”很小,需要由单个线程处理——因此在单个线程消耗事件后自动重置。
是的。这就像收费站和门的区别。ManualResetEvent是门,需要手动关闭(重置)。AutoResetEvent是一个收费站,允许一辆车通过,在下一辆车通过之前自动关闭。