2012-06-21 29 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