【问题标题】:What resources do AutoResetEvent / ManualResetEvent consume?AutoResetEvent / ManualResetEvent 消耗哪些资源?
【发布时间】:2015-08-20 16:45:03
【问题描述】:

c# ManualResetEventAutoResetEvent 类的创建或维护成本高吗?

它们是否消耗某种有限的 Windows 内核资源,如果是,那么它的限制程度如何?

例如如果我的代码可以每 100 毫秒创建一个新的 AutoResetEvent(稍后将被释放),我是否应该担心将旧的 AutoResetEvents 放入池中并重用它们,或者这不是一个重要的问题?

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

有ManualResetEventSlim,但没有AutoResetEventSlim,这也让我有点担心。

【问题讨论】:

  • 我会建议一种替代设计,它不需要创建所有这些动态事件。
  • 感谢您的建议,这也是我的直观理解。你为什么要建议呢?动态创建这些事件的隐藏成本到底是多少?
  • 它基于嵌入式系统的经验。通常线程和线程同步对象都是预先创建的。
  • 这非常适合“如果您需要知道,那么您做错了”类别。限制远远超出了您完全失去对程序中线程的控制的程度。取决于最大分页内核内存池大小,百万。

标签: c# .net autoresetevent manualresetevent waithandle


【解决方案1】:

ManualResetEvent 使用Wait Handles 而ManualResetEventSlim 使用Busy Spinning

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

鉴于您的用例,我建议您使用“slim”类,因为您只需要等待很短的时间。此外,如果“slim”类等待的时间过长,它无论如何都会表现为“non-slim”类。

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


编辑:这就是AutoResetEvent 没有“slim”版本的原因——基本上是因为 AutoResetEvent 的等待时间通常比 ManualResetEvent 长,所以不适合使用“忙转”


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

请参阅herehere 了解更多信息。


【讨论】:

  • AutoResetEvent 或 ManualResetEvent 使用的 WaitHandle 消耗了哪些资源?鉴于 ManualResetEventSlim 在更长的等待时间内表现为 ManualResetEvent,我认为这些等待时间的资源消耗也相似。
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 2015-10-30
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多