use*_*926 31 .net c# multithreading base-class-library c#-4.0
为什么AutoResetEventSlim
BCL 没有班级?
可以使用模拟ManualResetEventSlim
吗?
Ree*_*sey 28
ManualResetEvent
和ManualResetEventSlim
这两个设计,使他们保持通话后发出信号.这通常用于非常不同的场景AutoResetEvent
.
AutoResetEvent
在使用后立即返回到未信号状态,这通常用于不同的场景集.从AutoResetEvents文档:
通常,当线程需要对资源的独占访问时,可以使用此类.
ManualResetEvent
Slim
然而,通常使用(和)用于以下情况的场景:
此通信涉及一个线程必须在其他线程可以继续之前完成的任务.
由于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)
翻译SemaphoreSlim
和1
翻译0
.
第二个参数定义可以同时进入信号量的最大线程数.将其设置为1可使其行为类似于new AutoResetEvent( true )
.
关于SemaphoreSlim的另一个好处是,使用4.5中的新async/await模式,类已经收到了一个new SemaphoreSlim( 1, 1 )
可以等待的方法.因此,在这种情况下不再需要手动创建等待的等待原语.
希望这可以帮助.