在发出信号后Dispose()一个EventWaitHandle是否安全?

时间:2011-03-15 11:09:05

标签: .net multithreading events

我遇到的情况是我创建了许多IDisposable个对象,每个对象封装一个EventWaitHandle个实例,因此我的应用程序的各个感兴趣的部分可以等待它们。此实例不能直接访问其所有者对象之外的任何代码。它只能通过包装调用间接访问。

一旦一个对象发出信号就完成了它,它就不再有用了,所以它由一个中央管理器对象处理,并从它的引用列表中抛出。

现在的问题是,如何处理封装的EventWaitHandle?当然,它也应该被处理,并且应该尽快,以防止我的应用程序泄漏操作系统句柄。

但在事件由其所有者对象发出信号后立即同步执行此操作是否安全?如果有线程仍在等待释放(即阻止调用WaitOne()),会发生什么?

这里推荐的方法是什么?

1 个答案:

答案 0 :(得分:1)

我想是时候用我自己的发现结束这个了。

我在文档中找不到任何直接指南,但决定遵循我从Raymond Chen的博客中提取的信息。在他的帖子中(我忘记了确切的链接),他提到Win32 API规则规定事件的句柄必须在等待期间保持有效。在非托管世界中,这意味着事件的至少一个句柄必须保持打开状态。

AFAIU,.NET的实现使用Win32 API,每个EventWaitHandle实例对应一个单独的非托管事件。当EventWaitHandle.Dispose()关闭基础非托管事件的唯一句柄时,这会有效地使事件实例无效。

简而言之,正确的方法似乎是建立一个并行基础设施,通过该基础设施,事件发布者可以通知潜在的听众,事件将很快消失。然后发布者必须等到所有侦听器都“取消订阅”(即停止等待),然后再继续Dispose()事件实例。

这是很多簿记,但最终,它似乎是正确的。希望这也有助于为他人清除事情。