我有一个 C# 程序,它打开一个像这样的 EventWaitHandle 来由 Windows 服务触发。
EventWaitHandle sampleEventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "Global\\sampleEvent");
当程序现在被杀死(或由于意外错误而死亡)时,EventWaitHandle 不会被关闭,并且在重新启动程序时会发生以下错误:
一分钟后,EventWaitHandle 关闭,您可以重新启动应用程序。
任何想法如何解决这个问题?
最佳答案
发生这种情况是因为该服务在同一对象上打开了一个句柄。这是可以预料的,毕竟您正在使用它来实现服务和程序之间的信令。在最后一个句柄关闭之前,物理底层 Windows 命名对象不会从全局命名空间中删除。
因此,在此方面获得异常可为您提供真正的问题诊断,该服务使用了错误的句柄,并且在您重新启动程序时永远无法与您通信。一分钟后如何解决这个问题很难猜测,我必须假设该服务会定期调用 OpenExisting()。
解决方案很简单:它应该是创建等待句柄的服务,并且您的 UI 程序应该调用 OpenExisting()。该事件现在始终存在,至少只要服务处于事件状态。如果没有,那么 OpenExisting() 会通过 WaitHandleCannotBeOpenedException 为您提供出色的诊断
关于c# - EventWaitHandle 没有在进程终止时关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11146729/