2012-06-21 81 views
3

我得到了一个C#程序,它打开一个EventWaitHandle,这样就可以被Windows服务触发。EventWaitHandle没有关闭进程kill

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

当程序现在就会被杀死(或死亡由于意外错误),是的EventWaitHandle不关闭并重新启动程序时出现以下错误:

System.UnauthorizedAccessException的:访问到路径被拒绝。
在System.IO .__ Error.WinIOError(的Int32的errorCode,字符串maybeFullPath)
在System.Threading.EventWaitHandle..ctor(布尔的初始化状态,EventResetMode模式,字符串名称)

一分钟后,将的EventWaitHandle正在关闭,您可以重新启动应用程序。

任何想法如何解决这个问题?

+0

http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.eventwaithandlerights.aspx –

+0

谢谢。我认为这会解决我的问题。你知道默认的EventWaitHandleSecurity是什么吗? (出于兴趣,我想知道) – Zulakis

+0

知道如何自动关闭EventWaitHandle进程kill ...仍然很有趣... – Zulakis

回答

2

发生这种情况是因为服务在同一对象上打开了一个句柄。毕竟你正在使用它来实现服务和你的程序之间的信号,这是可以预料的。在最后一个句柄关闭之前,物理底层Windows命名对象不会从全局名称空间中删除。

因此,在此问题上得到一个异常会给您一个真正的问题诊断,该服务使用错误的句柄,并且在重新启动程序时无法与您通信。一分钟后如何解决这个问题很难猜出,我不得不假定该服务会定期调用OpenExisting()。

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

+0

谢谢。因为你的评论我发现了什么是错的。我没有关闭Windows服务中的EventWaitHandle,这就是为什么在关闭GUI之后它仍然处于活动状态。 – Zulakis