Process.ExitTime "Process was not started by this object, so requested information cannot be determined." 上的 InvalidOperationException 是什么意思

What means an InvalidOperationException on Process.ExitTime "Process was not started by this object, so requested information cannot be determined."

我们有一个工具可以管理计算机的多个进程,在不确定的情况下,我们有时会在访问 MSDN 时得到 InvalidOperationExceptionProcess.ExitTime 属性.

异常消息显示

process was not started by this object, so requested information cannot be determined

那是否意味着我只能获取我自己启动的进程的退出时间?这在任何地方都没有记录。

根据MSDN的例子,首先你需要启动一个进程,然后你需要等待它退出,此时你可以得到一个myProcess.ExitCode值。可能您只是在创建的 Process 对象中填写了一些字段但没有启动它。此外,如果你想获得你不允许控制的外部进程的退出时间,你需要使用一些监视器或挂钩来获得退出时间。不过,你提供的信息不足以掌握你的意图,如果你不介意的话,就提供吧。

为了访问退出时间信息,Process class 需要为进程a 打开句柄。虽然例如WaitForExit 将临时创建一个句柄,不幸的是它会在返回前关闭该句柄。

我们可以强制 Process class 通过访问其 HandleSafeHandle 属性1[= 永久打开进程句柄41=]。但是,我们应该注意到这里仍然存在 一些 的不合理之处,因为在构建 Process 对象和访问 SafeHandle 属性 之间,进程可能会退出。

启动一个记事本实例,找到它的进程ID并在此处编辑到Main的第一行:

using System;
using System.Diagnostics;

namespace PlayAreaCSCon
{
  internal class Program
  {
    public static void Main(string[] args)
    {
      var p = Process.GetProcessById(18148);
      //var sh = p.SafeHandle;
      p.WaitForExit();

      Console.WriteLine(p.ExitTime);
      Console.ReadLine();
    }
  }
}

一旦这个程序是 运行,退出记事本并观察我们得到你提到的异常。清理并启动另一个记事本副本。这次,在编辑进程 ID 后,也取消注释提到 SafeHandle 的行。

此程序再次 运行 后,退出记事本。观察这次我们得到了退出时间。所以你可以希望看到这个异常 can 是如何出现的,我想我们都同意这个消息非常不完整。


a而且对于已经退出的进程,它不能神奇地使一个存在。

1可能有很多额外的入口点间接导致访问这些属性,因此对句柄产生副作用 - 但这些是最明显的途径强制打开手柄。