为什么BCL中没有AutoResetEventSlim类?
是否可以使用ManualResetEventSlim进行模拟
发布于 2011-11-22 01:00:33
ManualResetEvent和ManualResetEventSlim都是这样设计的,即它们在调用后仍保持信号状态。这通常适用于与AutoResetEvent截然不同的场景。
AutoResetEvent在使用后立即返回到无信号状态,这通常用于一组不同的场景。来自AutoResetEvents文档:
通常,当线程需要独占访问资源时,可以使用此类。
但是,ManualResetEvent (和Slim)通常用于以下场景:
此通信涉及一个线程必须在其他线程继续执行之前完成的任务。
由于AutoResetEvent最常用于有多个线程共享资源的场景,因此等待时间通常不会非常短。然而,ManualResetEventSlim实际上只在您预先知道等待时间非常短的情况下才会使用。如果您的等待时间不是很短,那么您应该改用ManualResetEvent。有关详细信息,请参阅difference between MRE and MRES上的文档。
当您的等待时间更长时(这将是AutoResetEvent的正常情况),“瘦”版本实际上更糟糕,因为它恢复到使用等待句柄。
发布于 2014-09-13 20:46:57
我也被这个事实所困扰。但是,您似乎可以使用具有特殊配置的简单SemaphoreSlim来模拟AutoResetEvent(Slim):
SemaphoreSlim Lock = new SemaphoreSlim( 1, 1 );在the constructor中,第一个参数定义信号量的初始状态:1表示一个线程可以进入,0表示信号量必须首先释放。因此,new AutoResetEvent( true )转换为new SemaphoreSlim( 1, 1 ),new AutoResetEvent( false )分别转换为new SemaphoreSlim( 0, 1 )。
第二个参数定义可以并发进入信号量的最大线程数。将其设置为1将使其行为类似于AutoResetEvent。
关于SemaphoreSlim的另一件好事是,在4.5中的新async/await模式中,该类收到了一个可以等待的.WaitAsync() method。因此,在这种情况下,不再需要手动创建可等待的等待原语。
希望这能有所帮助。
https://stackoverflow.com/questions/8215380
复制相似问题