다른 응용 프로그램과 함께 작동하는 Windows 서비스를 만들고 있습니다. 이러한 응용 프로그램은 VIA Remoting 서비스와 통신을 시작합니다. 연결이 완료되면 서비스가 중지되면 즉시 통신을 중지하도록 응용 프로그램에 요청합니다. 의미는 더 이상 유효하지 않은 IpcConnection을 사용하려고했기 때문에 Timer가 경과하거나 예외가 발생하기를 기다리는 것을 원하지 않습니다.외부 프로세스 (서비스)를위한 WaitForExit() 방법
서비스가 아닌 서비스가 대화 형으로 실행되는 경우 모두 작동합니다. 서비스로 실행되면 예외가 발생합니다. 서비스가 대화 형으로 실행되는지 또는 대화 형으로 실행되는지에 관계없이 서비스는 관리자로 실행됩니다. 관리자로 다른 응용 프로그램을 실행하면 예상대로 작동합니다. 안타깝게도이 애플리케이션을 관리자로 실행하는 것은 프로덕션에서는 옵션이 아닙니다.
나는 예외의 원인을 좁히기로했습니다.
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 클래스의 작동 방식을 변경할 수 없습니다. 그리고 그것은 확실히 작별 인사를 시작하는 서비스로 시작해야하므로 힘든 방법을 찾아야 할 필요가 없습니다. 하드 크래시로 죽을 때도 작동하지 않습니다. 예외적으로 예외가 발생해야합니다. –