我有一个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即被关闭,您可以重新启动应用程序。
如何解决此问题?
答案 0 :(得分:2)
这是因为服务在同一对象上打开了句柄。毕竟您正在使用它来实现服务和程序之间的信令。在关闭最后一个句柄之前,不会从全局命名空间中删除物理基础Windows命名对象。
因此,对此进行异常会给您一个真正的问题诊断,该服务使用了错误的句柄,并且在您重新启动程序时永远无法与您通信。如何在一分钟之后解决这个问题很难猜测,我必须假设服务定期调用OpenExisting()。
解决方案很简单:应该是 service 创建等待句柄,你的UI程序应该调用OpenExisting()。事件现在总是存在,至少只要服务还活着。如果没有,那么OpenExisting()会使用WaitHandleCannotBeOpenedException为您提供出色的诊断