我正在开发一个依赖于监视服务(以 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() 方法之后才释放资源。
如果这个问题有更优雅的解决方案,请告诉我。