首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么BCL中没有AutoResetEventSlim?

为什么BCL中没有AutoResetEventSlim?
EN

Stack Overflow用户
提问于 2011-11-22 00:51:15
回答 2查看 6K关注 0票数 38

为什么BCL中没有AutoResetEventSlim类?

是否可以使用ManualResetEventSlim进行模拟

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-22 01:00:33

ManualResetEventManualResetEventSlim都是这样设计的,即它们在调用后仍保持信号状态。这通常适用于与AutoResetEvent截然不同的场景。

AutoResetEvent在使用后立即返回到无信号状态,这通常用于一组不同的场景。来自AutoResetEvents文档:

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

但是,ManualResetEvent (和Slim)通常用于以下场景:

此通信涉及一个线程必须在其他线程继续执行之前完成的任务。

由于AutoResetEvent最常用于有多个线程共享资源的场景,因此等待时间通常不会非常短。然而,ManualResetEventSlim实际上只在您预先知道等待时间非常短的情况下才会使用。如果您的等待时间不是很短,那么您应该改用ManualResetEvent。有关详细信息,请参阅difference between MRE and MRES上的文档。

当您的等待时间更长时(这将是AutoResetEvent的正常情况),“瘦”版本实际上更糟糕,因为它恢复到使用等待句柄。

票数 31
EN

Stack Overflow用户

发布于 2014-09-13 20:46:57

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

代码语言:javascript
复制
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。因此,在这种情况下,不再需要手动创建可等待的等待原语。

希望这能有所帮助。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8215380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档