Я работаю над проектом, который опирается на службу мониторинга (в форме службы 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 ().
Если есть более элегантное решение этой проблемы, пожалуйста, дайте мне знать.