39

AutoResetEventSlim为什么BCL中没有类?

可以用它来模拟ManualResetEventSlim吗?

4

2 回答 2

31

ManualResetEvent并且ManualResetEventSlim两者都被设计为在呼叫后保持信号状态。这通常适用于与AutoResetEvent.

AutoResetEvent使用后立即返回无信号状态,这通常用于一组不同的场景。来自 AutoResetEvents 文档:

通常,当线程需要对资源进行独占访问时,您会使用此类。

ManualResetEvent但是, (和Slim)通常用于以下情况:

这种通信涉及一个线程必须在其他线程可以继续之前完成的任务。

由于AutoResetEvent最常用于有多个线程共享资源的场景,因此等待时间通常不会非常短。 ManualResetEventSlim但是,实际上只有在您事先知道等待时间很短时才打算这样做。如果您的等待时间不会很短,那么您应该使用ManualResetEvent有关详细信息,请参阅有关MRE 和 MRES 之间差异的文档。

当您的等待时间较长时(这将是 的正常情况AutoResetEvent),“苗条”版本实际上更糟,因为它恢复为使用等待句柄。

于 2011-11-21T17:00:33.040 回答
27

我也被这个事实所困扰。但是,您似乎可以使用具有特殊配置AutoResetEvent(Slim)的简单来模拟:SemaphoreSlim

SemaphoreSlim Lock = new SemaphoreSlim( 1, 1 );

构造函数中,第一个参数定义了信号量的初始状态:1表示一个线程可以进入,0信号量必须先被释放。所以分别new AutoResetEvent( true )翻译成new SemaphoreSlim( 1, 1 )new AutoResetEvent( false )翻译成new SemaphoreSlim( 0, 1 )

第二个参数定义了可以同时进入信号量的最大线程数。将其设置为1使其行为类似于AutoResetEvent.

关于 4.5 的另一个好处SemaphoreSlim是,使用 4.5 中的新async/await模式,该类已经收到了一个可以等待的.WaitAsync()方法。因此,在这种情况下不再需要手动创建可等待的等待原语。

希望这可以帮助。

于 2014-09-13T12:46:56.950 回答