为什么BCL中没有AutoResetEventSlim?

use*_*926 31 .net c# multithreading base-class-library c#-4.0

为什么AutoResetEventSlimBCL 没有班级?

可以使用模拟ManualResetEventSlim吗?

Ree*_*sey 28

ManualResetEventManualResetEventSlim这两个设计,使他们保持通话后发出信号.这通常用于非常不同的场景AutoResetEvent.

AutoResetEvent在使用后立即返回到未信号状态,这通常用于不同的场景集.从AutoResetEvents文档:

通常,当线程需要对资源的独占访问时,可以使用此类.

ManualResetEventSlim然而,通常使用(和)用于以下情况的场景:

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

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

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


Sim*_*tes 17

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

SemaphoreSlim Lock = new SemaphoreSlim( 1, 1 );
Run Code Online (Sandbox Code Playgroud)

第一个参数(http://msdn.microsoft.com/en-us/library/dd270891(v=vs.110).aspx)定义了信号量的初始状态:1表示一个线程可以进入,0表示必须首先释放信号量.因此分别AutoResetEvent(Slim)翻译SemaphoreSlim1翻译0.

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

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

希望这可以帮助.