AutoResetEvent / ManualResetEvent使用哪些资源?

时间:2015-08-20 16:45:04

标签: c# .net autoresetevent manualresetevent waithandle

创建或维护c#ManualResetEventAutoResetEvent类费用是否昂贵?

他们是否使用某种有限的Windows内核资源,如果是这样,它有多受限制?

E.g。如果我的代码可以每100毫秒创建一个新的AutoResetEvent(之后不久就会被处理),我是否应该担心将旧的AutoResetEvents放入池中并重用它们,或者这不是一个重要的问题?

由于它们是IDisposables,我认为它们会消耗某种有限的资源。它们消耗了多少,在哪一点上我应该开始担心使用太多它们?

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

1 个答案:

答案 0 :(得分:0)

ManualResetEvent使用Wait Handles而ManualResetEventSlim使用Busy Spinning

最佳性能依次为:1)标准锁定(监控)2)“苗条”事件类3)标准事件类

考虑到你的用例,我建议使用“苗条”课程,因为你只会等待很短的时间。此外,如果一个“苗条”课程等待时间过长,无论如何它都会表现为“非苗条”课程。

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

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

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

有关详细信息,请参阅herehere