C# 为什么BCL中没有AutoResetEventSlim?
为什么BCL中没有一个C# 为什么BCL中没有AutoResetEventSlim?,c#,.net,multithreading,c#-4.0,base-class-library,C#,.net,Multithreading,C# 4.0,Base Class Library,为什么BCL中没有一个AutoResetEventSlim类 是否可以使用ManualResetEventSlim进行模拟?ManualResetEvent和ManualResetEventSlim都设计为在呼叫后保持信号状态。这通常适用于与AutoResetEvent非常不同的场景 AutoResetEvent使用后立即返回到未标记状态,这通常用于不同的场景集。从AutoResetEvents文档: 通常,当线程需要独占访问资源时,使用此类 然而,对于以下情况,通常使用ManualResetE
AutoResetEventSlim
类
是否可以使用
ManualResetEventSlim
进行模拟?ManualResetEvent
和ManualResetEventSlim
都设计为在呼叫后保持信号状态。这通常适用于与AutoResetEvent
非常不同的场景
AutoResetEvent
使用后立即返回到未标记状态,这通常用于不同的场景集。从AutoResetEvents文档:
通常,当线程需要独占访问资源时,使用此类
然而,对于以下情况,通常使用
ManualResetEvent
(和Slim
):
此通信涉及一个任务,其中一个线程必须在其他线程继续之前完成该任务
由于AutoResetEvent
最常用于多线程共享资源的场景,因此等待时间通常不会非常短<然而,代码>手动重置事件slim实际上只有在您事先知道等待时间非常短的情况下才能使用。如果等待时间不是很短,则应改用ManualResetEvent
。有关详细信息,请参阅上的文档
当您的等待时间更长时(这是AutoResetEvent的正常情况),“slim”版本实际上更糟糕,因为它恢复使用等待句柄。我也被这一事实所困扰。 但是,您似乎可以使用具有特殊配置的简单配置来模拟
自动重置事件(Slim)
:
SemaphoreSlim Lock = new SemaphoreSlim( 1, 1 );
在中,第一个参数定义了信号量的初始状态:1
意味着一个线程可以进入,0
,必须首先释放信号量。因此newautoresetevent(true)
分别转换为newsemaphoreslim(1,1)
和newautoresetevent(false)
转换为newsemaphoreslim(0,1)
第二个参数定义可以同时进入信号量的最大线程数。将其设置为1
可以使其行为类似于AutoResetEvent
SemaphoreSlim
的另一个优点是,在4.5中使用了新的async
/await
模式,类收到了一个可以等待的消息。因此,在这种情况下,不再需要手动创建等待原语
希望这有帮助。
AutoResetEventSlim
可以使用SemaphoreSlim
进行模拟。