1

我正在开发一个依赖于监视服务(以 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() 方法之后才释放资源。

如果这个问题有更优雅的解决方案,请告诉我。

4

1 回答 1

4

Process.Close不会终止实际过程。它对过程完全没有影响;它只是释放Process类的资源(之后它不再可用,正如你所发现的)

如果您打算结束该过程,则必须使用另一种方法,例如Process.KillProcess.CloseMainWindow

Process.Close有不同的用途;Process.Dispose完成Process类实例后,您应该调用它(或)。

于 2011-07-26T16:25:24.500 回答