我正在創建一個Windows服務與其他應用程序一起工作。這些應用程序開始與服務VIA Remoting通信。一旦建立連接,我希望應用程序在服務停止時立即停止通信。這意味着我不想等待Timer超時或發生異常,因爲通信嘗試使用不再有效的IpcConnection。如何等待外部進程()爲外部進程(服務)
當服務以交互方式運行而不是作爲服務運行時,這一切都有效。當它作爲服務運行時,我得到一個異常。無論是作爲服務還是以交互方式運行,該服務都以Admin身份運行。如果我以管理員身份運行其他應用程序,那麼它按預期工作。不幸的是,以管理員身份運行此應用程序將不會成爲生產中的選項。
我已經縮小到導致異常的原因。
var serverProc = Process.GetProcessById(_remote.ProcessId);
serverProc.WaitForExit();
serverProc
是成功的,但WaitForExit
失敗。
System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
at System.Diagnostics.Process.WaitForExit(Int32 milliseconds)
我可以用Timer
代替這個代碼,但我希望這個當前的技術可以工作。
我在做一些工作,是否有我可以做的事情來避免異常並使用類似的代碼?
這是完全正常的。你必須務實,你不能改變Process類的工作方式。這當然需要從你的服務開始,很好地說再見,所以你不必找出困難的方式。當它從一次嚴重的撞車中死亡後仍然無法工作。但是一些特殊的事情發生了,它應該產生一個例外。 –