Я создаю службу Windows, которая работает рука об руку с другими приложениями. Эти приложения начинают связь с сервисом VIA Remoting. После того, как соединение было сделано, я хочу, чтобы приложения немедленно прекратили связь, если служба остановлена. Это означает, что я не хочу ждать окончания таймера или иметь исключение, потому что связь пыталась использовать IpcConnection, которая больше не действительна.Как WaitForExit() для внешнего процесса (службы)
Это все работает, когда служба работает Интерактивно, а не как служба. Когда он запускается как служба, я получаю исключение. Служба запускается как 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. И это, безусловно, нужно начинать с того, что ваш сервис попрощался красиво, поэтому вам не нужно искать трудный путь. Все равно не будет работать, когда он умрет от тяжелого крушения. Но что-то исключительное произошло, оно должно вызвать исключение. –