Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么BCL中没有AutoResetEventSlim?_C#_.net_Multithreading_C# 4.0_Base Class Library - Fatal编程技术网

C# 为什么BCL中没有AutoResetEventSlim?

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

为什么BCL中没有一个
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
进行模拟。