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()方法。因此,在这种情况下不再需要手动创建可等待的等待原语。
希望这可以帮助。