EventWaitHandle在进程终止时没有关闭

时间:2012-06-21 21:04:02

标签: c# .net events windows-services ipc

我有一个C#程序,打开一个这样的EventWaitHandle,由Windows服务触发。

EventWaitHandle sampleEventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "Global\\sampleEvent");

当程序现在被杀死(或由于意外错误而死亡)时,EventWaitHandle没有被关闭,并且在重新启动程序时发生以下错误:

  

System.UnauthorizedAccessException:拒绝访问路径。      
在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)      
在System.Threading.EventWaitHandle..ctor(Boolean initialState,EventResetMode mode,String name)

一分钟后,EventWaitHandle即被关闭,您可以重新启动应用程序。

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

这是因为服务在同一对象上打开了句柄。毕竟您正在使用它来实现服务和程序之间的信令。在关闭最后一个句柄之前,不会从全局命名空间中删除物理基础Windows命名对象。

因此,对此进行异常会给您一个真正的问题诊断,该服务使用了错误的句柄,并且在您重新启动程序时永远无法与您通信。如何在一分钟之后解决这个问题很难猜测,我必须假设服务定期调用OpenExisting()。

解决方案很简单:应该是 service 创建等待句柄,你的UI程序应该调用OpenExisting()。事件现在总是存在,至少只要服务还活着。如果没有,那么OpenExisting()会使用WaitHandleCannotBeOpenedException为您提供出色的诊断