Process.WaitForExit方法在Process.Close之后抛出InvalidOperation异常

时间:2011-07-26 16:19:12

标签: c# .net process windows-services heartbeat

我正在开发一个项目,该项目依赖于监视服务(以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.Close()的位置调用process.CloseMainWindow(),它调用所有相关的清理方法,直到WaitForExit()方法之后才释放资源。

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

1 个答案:

答案 0 :(得分:4)

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

如果您打算结束此过程,则必须使用其他方法,例如Process.KillProcess.CloseMainWindow

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