我已经阅读了关于这方面的文档,我想我明白了。AutoResetEvent在代码通过event.WaitOne()时重置,但ManualResetEvent不会。

这对吗?


当前回答

autoResetEvent.WaitOne ()

类似于

try
{
   manualResetEvent.WaitOne();
}
finally
{
   manualResetEvent.Reset();
}

作为原子操作

其他回答

是的。这是绝对正确的。

您可以将ManualResetEvent视为指示状态的一种方式。某些东西打开(设置)或关闭(重置)。有一定持续时间的事件任何等待该状态发生的线程都可以继续。

AutoResetEvent更类似于信号。这是发生了什么事的一个迹象。没有任何持续时间的事件。通常情况下(但不一定)发生的“事情”很小,需要由单个线程处理——因此在单个线程消耗事件后自动重置。

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

AutoResetEvent还保证只释放一个等待线程。

是的,没错。

你可以通过这两者的用法得到一个概念。

如果你需要告诉别人你已经完成了一些工作,其他(线程)可以继续等待,你应该使用ManualResetEvent。

如果需要对任何资源进行互斥访问,则应该使用AutoResetEvent。

是的。这就像收费站和门的区别。ManualResetEvent是门,需要手动关闭(重置)。AutoResetEvent是一个收费站,允许一辆车通过,在下一辆车通过之前自动关闭。

简短的回答是肯定的。最重要的区别是AutoResetEvent只允许一个等待线程继续。另一方面,ManualResetEvent将继续允许线程,甚至同时允许几个线程继续,直到您告诉它停止(重置它)。