Метод Process.WaitForExit Отвечает за исключение InvalidOperation после Process.Close - PullRequest
1 голос
/ 26 июля 2011

Я работаю над проектом, который опирается на службу мониторинга (в форме службы Windows), которая проверяет простое сердцебиение TCP из основной службы. Всякий раз, когда пульс не обнаруживается в течение определенного периода времени или вообще не обнаруживается основной процесс обслуживания, он запускает новый. Чтобы убедиться, что одновременно работает только одна основная служба, она также закроет все запущенные в данный момент процессы с тем же именем перед запуском нового экземпляра.

Проблема, с которой я столкнулся, связана со следующим кодом:

 var processes = from p in Process.GetProcessesByName("Acme") select p;

 foreach (var process in processes)
 {
     ...

     process.Close();

     process.WaitForExit(10000);
     if (!process.HasExited)
         process.Kill();
 }

Поскольку метод process.Close () освободил все ресурсы, связанные с этим процессом, метод WaitForExit () вызвал исключение. Я не хотел сразу убивать () процесс, так как хотел, чтобы методы очистки запускались в главном сервисе при закрытии.

Решением моей проблемы было вызвать process.CloseMainWindow () вместо process.Close (), который вызвал все связанные методы очистки и не освободил ресурсы до окончания метода WaitForExit ().

Если есть более элегантное решение этой проблемы, пожалуйста, дайте мне знать.

1 Ответ

4 голосов
/ 26 июля 2011

Process.Close не завершает фактический процесс. Это никак не влияет на процесс; он просто освобождает ресурсы класса Process (после которого он больше не может использоваться, как вы обнаружили)

Если вы намерены завершить процесс, вы должны использовать другой метод, например Process.Kill или Process.CloseMainWindow.

Process.Close имеет другое назначение; Вы должны вызывать это (или Process.Dispose) после того, как закончите с экземпляром класса Process.

...