AutoResetEvent / ManualResetEvent消耗哪些资源?

4

创建和维护c#的ManualResetEventAutoResetEvent类是否昂贵?

它们是否消耗某种有限的Windows内核资源,如果是,那么这个限制有多大?

例如,如果我有能够每100毫秒创建一个新的AutoResetEvent(很快就会被处理)的代码,我应该担心将旧的AutoResetEvents放入池中并重复使用它们,或者这不是一个重要问题?

由于它们是IDisposables,我认为它们会消耗某种有限的资源。它们到底消耗多少,在什么时候我应该开始担心使用过多?

手动重置事件的存在让我有点担心,但没有自动重置事件的相应类。


我建议采用另一种设计,不需要创建那么多的动态事件。 - Philip Stuyck
谢谢您的建议,这也是我直觉的理解。但是,为什么您会建议这样做呢?动态创建这些事件的隐藏成本是什么? - HugoRune
它基于嵌入式系统的经验。通常情况下,线程和线程同步对象都是预先创建的。 - Philip Stuyck
这非常符合“如果你需要知道,那么你做错了”的类别。限制远远超出了您在程序中完全失去线程控制的点。这取决于最大页面内核内存池大小,以百万计。 - Hans Passant
1个回答

1

ManualResetEvent使用Wait Handles,而ManualResetEventSlim使用Busy Spinning

性能最佳的顺序是:1)标准锁定(Monitor)2)“slim”事件类3)标准事件类。

根据您的用例,我建议使用“slim”类,因为您只需要等待很短的时间。此外,如果“slim”类等待时间太长,它会像“非slim”类一样行事。

请注意,您不能跨进程使用“slim”类。


编辑:这就是为什么AutoResetEvent没有“slim”版本的原因 - 基本上是因为AutoResetEvent的等待时间通常比ManualResetEvent长,因此不适合使用“busy spinning”。

编辑:等待句柄继承自MarshalByRefObject。最终,.NET运行时为远程访问您的等待句柄设置了代理(TransparentProxy类)。

有关更多信息,请参见此处此处



2
这样的WaitHandle(如AutoResetEvent或ManualResetEvent)会消耗哪些资源?考虑到ManualResetEventSlim在更长的等待时间中的行为类似于ManualResetEvent,我认为这些等待时间的资源消耗也是相似的。 - HugoRune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接