【问题标题】:What are the reasons Process.HasExited can throw InvalidOperationException?Process.HasExited 会抛出 InvalidOperationException 的原因是什么?
【发布时间】:2010-04-08 20:39:53
【问题描述】:

我看到System.Diagnostics.Process.HasExited 方法抛出InvalidOperationException,但消息文本属性对于抛出它的原因并不是非常有用。在什么情况下会抛出这个异常?

【问题讨论】:

    标签: c# .net process invalidoperationexception


    【解决方案1】:

    我看到了同样的消息。如果您这样做,可能会发生这种情况:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • +=:在您关闭/处置对象之前,底层系统会保留一些资源以允许您跟踪旧进程的状态。当您关闭/处置它时,它们会被释放,因此 PID 编号(和/或句柄地址等)可能会被重新用于另一个全新的进程。如果之后您尝试查询它们的进程状态,您可以获得(缓存的)信息,例如“PID=2688 is KILLED with exitcode 0x34”,而 2688 数字可以 已经再次运行,你可能搞砸了。更糟糕的是:您可能获得有关新进程的(未缓存的)信息,而且肯定会搞砸。
      【解决方案3】:

      documentation 声明在没有进程与对象关联的情况下引发 InvalidOperation 异常。

      您是否已经使用Process.Start() 启动了该进程,或者在您访问HasExited 属性之前该进程已被释放?

      post 也处理同样的问题。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          不要拨打Terminate.Close(),而是拨打Terminate.CloseMainWindoe()

          然后您可以发出定时等待,检查HasExited 并在需要时致电Kill()

          【讨论】:

          • 欢迎来到 Stack Overflow!请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为什么会解决问题的解释。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-29
          • 2013-08-09
          • 1970-01-01
          • 2011-01-10
          相关资源
          最近更新 更多