4

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

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

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

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

有一个 ManualResetEventSlim,但没有 AutoResetEventSlim 的事实也让我有点担心。

4

1 回答 1

1

ManualResetEvent 使用等待句柄,而 ManualResetEventSlim 使用Busy Spinning

最好的性能依次是:1)标准锁定(监视器)2)“苗条”事件类3)标准事件类

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

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


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


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

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


于 2015-08-20T16:52:58.997 回答