AutoResetEventSlim
为什么BCL中没有类?
可以用它来模拟ManualResetEventSlim
吗?
AutoResetEventSlim
为什么BCL中没有类?
可以用它来模拟ManualResetEventSlim
吗?
ManualResetEvent
并且ManualResetEventSlim
两者都被设计为在呼叫后保持信号状态。这通常适用于与AutoResetEvent
.
AutoResetEvent
使用后立即返回无信号状态,这通常用于一组不同的场景。来自 AutoResetEvents 文档:
通常,当线程需要对资源进行独占访问时,您会使用此类。
ManualResetEvent
但是, (和Slim
)通常用于以下情况:
这种通信涉及一个线程必须在其他线程可以继续之前完成的任务。
由于AutoResetEvent
最常用于有多个线程共享资源的场景,因此等待时间通常不会非常短。 ManualResetEventSlim
但是,实际上只有在您事先知道等待时间很短时才打算这样做。如果您的等待时间不会很短,那么您应该使用ManualResetEvent
。有关详细信息,请参阅有关MRE 和 MRES 之间差异的文档。
当您的等待时间较长时(这将是 的正常情况AutoResetEvent
),“苗条”版本实际上更糟,因为它恢复为使用等待句柄。
我也被这个事实所困扰。但是,您似乎可以使用具有特殊配置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()
方法。因此,在这种情况下不再需要手动创建可等待的等待原语。
希望这可以帮助。