Process.HasExited可以抛出InvalidOperationException的原因是什么?

时间:2010-04-08 20:39:53

标签: c# .net

我看到一个System.Diagnositics.Process.HasExited方法抛出一个InvalidOperationException,但是消息文本属性对它抛出的原因并不十分有用。在什么条件下抛出这个异常?

5 个答案:

答案 0 :(得分:7)

我看到同样的消息。如果你这样做会发生:

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方法。

答案 1 :(得分:5)

正如Obalix正确指出的那样,当InvalidOperationException对象没有附加任何进程时,会抛出Process。如果进程已退出且CloseDispose已在Process对象上调用,则会发生这种情况。 Close从内存中释放与进程相关的所有资源。在调用Close之前,这些数据保存在内存中,为您(程序员)提供您想要了解的有关已退出流程的信息,例如ExitTimeExitCode

答案 2 :(得分:3)

documentation表示在没有进程的情况下抛出InvalidOperation异常与该对象关联。

您是否已使用Process.Start()启动了该流程,或者在访问HasExited媒体资源之前是否处理了该流程?

post也会解决同样的问题。

答案 3 :(得分:2)

如果以上两个答案都记住了进程的实例成员不是线程安全的,那么这可能是下一个开始查找的地方。

答案 4 :(得分:1)

请勿致电static class Sell { public String getClientName() { return null; } } // ... sells.stream().sorted(Comparator.comparing(Sell::getClientName, String::compareToIgnoreCase)) ,而是致电Terminate.Close()

然后,您可以发出定时等待,检查Terminate.CloseMainWindoe()并在必要时致电HasExited