Process.HasExited为什么会抛出InvalidOperationException异常?

7

我看到一个System.Diagnostics.Process.HasExited方法抛出了一个InvalidOperationException,但是它的消息文本属性并没有提供有用的信息来解释为什么会抛出异常。在什么条件下会抛出这个异常呢?

5个回答

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方法)处进行捕获。

5
如Obalix所说,当没有进程与Process对象相连时就会抛出InvalidOperationException。这种情况发生在一个进程已经退出并且Close或Dispose已经在Process对象上调用时。Close释放所有与该进程相关的资源,使这些数据从内存中消失。在调用Close之前,这些数据一直保留在内存中,以便为程序员提供关于退出进程的信息,例如其ExitTime和ExitCode。

1
+=: 直到您关闭/释放对象,底层系统会保留一些资源,以便您跟踪旧进程的状态。当您关闭/释放它时,它们将被释放,因此PID号码(和/或句柄地址等)可能会被重新用于全新的进程。如果之后您尝试查询它们以获取进程状态,则可能会得到一个(缓存的)信息,例如“PID=2688已使用退出代码0x34终止”,而2688号码可能已经再次运行,并且您可能会出现问题。更糟糕的是:您可能会获得有关新进程的(未缓存的)信息,并且肯定会出现问题。 - quetzalcoatl

3
文档说明,如果对象没有关联进程,则会抛出无效操作异常。
您是否已经使用Process.Start()启动了该进程,或者在访问HasExited属性之前,该进程已被处理?
这个帖子也涉及到同样的问题。

2
如果以上两个答案考虑到了进程实例成员不是线程安全的,那么下一个需要开始查找的地方可能就在这里。

1
不要调用 Terminate.Close(),改为调用 Terminate.CloseMainWindow()
然后您可以发出定时等待,检查 HasExited 并在需要时调用 Kill()

1
欢迎来到Stack Overflow!请考虑编辑您的帖子,添加更多关于代码的解释以及为什么它可以解决问题的说明。一个主要只包含代码的答案(即使它是有效的)通常不会帮助提问者理解他们的问题。 - SuperBiasedMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接