【发布时间】:2010-04-08 20:39:53
【问题描述】:
我看到System.Diagnostics.Process.HasExited 方法抛出InvalidOperationException,但消息文本属性对于抛出它的原因并不是非常有用。在什么情况下会抛出这个异常?
【问题讨论】:
标签: c# .net process invalidoperationexception
我看到System.Diagnostics.Process.HasExited 方法抛出InvalidOperationException,但消息文本属性对于抛出它的原因并不是非常有用。在什么情况下会抛出这个异常?
【问题讨论】:
标签: c# .net process invalidoperationexception
我看到了同样的消息。如果您这样做,可能会发生这种情况:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "trash filename here.exe";
try
{
proc.Start();
}
catch { }//proc should fail.
try
{
if (proc.HasExited)
{
//....
}
}
catch (System.InvalidOperationException e)
{
//cry and weep about it here.
}
如果proc.Start() 在上面失败了,你也应该去哭泣部分。所以,如果你在proc.Start() 之后赶上,一定要赶上proc.HasExited(以及许多其他System.Diagnostics.Process 方法。
【讨论】:
正如 Obalix 正确指出的那样,当没有进程附加到 Process 对象时,会引发 InvalidOperationException。当进程退出并且在Process 对象上调用了Close 或Dispose 时,就会发生这种情况。 Close 从内存中释放与进程相关的所有资源。在调用Close 之前,这些数据保存在内存中,以便为您(程序员)提供您想了解的有关退出进程的信息,例如ExitTime 和ExitCode。
【讨论】:
documentation 声明在没有进程与对象关联的情况下引发 InvalidOperation 异常。
您是否已经使用Process.Start() 启动了该进程,或者在您访问HasExited 属性之前该进程已被释放?
post 也处理同样的问题。
【讨论】:
如果以上两个答案考虑到进程的实例成员不是线程安全的,那么这可能是下一个开始寻找的地方。
【讨论】:
不要拨打Terminate.Close(),而是拨打Terminate.CloseMainWindoe()。
然后您可以发出定时等待,检查HasExited 并在需要时致电Kill()。
【讨论】: