【问题标题】:How to determine if a Process has started but not yet exited?如何确定进程是否已启动但尚未退出?
【发布时间】:2012-03-31 23:18:43
【问题描述】:

我有一些代码可以创建一个 Process 实例,然后再启动它。有一些逻辑需要检查进程是否已启动。 HasExited 可用于检查是否已退出已启动的进程,但我找不到 HasStarted 的类似功能。乍一看StartTime 看起来是个不错的选择,但如果进程退出,这个函数会抛出异常。此外,文档说StartTime 仅对已启动的进程有意义。

确定进程是否已启动(已启动,但可能已退出)的“正确”方法是什么?

【问题讨论】:

  • 稍微改变了问题,以更好地反映我在询问一个进程是否已经启动(它可能已经退出)。
  • 标题也改了一点...

标签: c# .net system.diagnostics


【解决方案1】:

虽然其他人建议的方法会奏效,但这并不是处理此类事情的最有效方法。如果一直循环检查进程是否退出,会浪费大量系统资源。 您关心的应该是只知道进程何时退出,而不是循环等待它检查它是否已经退出。所以,正确的方法是处理事件。

下面的代码解释了如何使用事件来做到这一点。

// Declare your process object with WithEvents, so that events can be handled.
private Process withEventsField_MyProcess;
Process MyProcess {
    get { return withEventsField_MyProcess; }
    set {
        if (withEventsField_MyProcess != null) {
            withEventsField_MyProcess.Exited -= MyProcess_Exited;
        }
        withEventsField_MyProcess = value;
        if (withEventsField_MyProcess != null) {
            withEventsField_MyProcess.Exited += MyProcess_Exited;
        }
    }
}

bool MyProcessIsRunning;
private void Button1_Click(System.Object sender, System.EventArgs e)
{
    // start the process. this is an example.
    MyProcess = Process.Start("Notepad.exe");

    // enable raising events for the process.
    MyProcess.EnableRaisingEvents = true;

    // set the flag to know whether my process is running
    MyProcessIsRunning = true;
}

private void MyProcess_Exited(object sender, System.EventArgs e)
{
    // the process has just exited. what do you want to do?
    MyProcessIsRunning = false;
    MessageBox.Show("The process has exited!");
}

编辑: 知道进程是否已经启动应该很容易,因为在代码中的某个地方启动进程。因此,您可以在那里设置一个标志,并在进程退出时将其设置为 false。我更新了上面的代码以显示如何轻松设置这样的标志。

【讨论】:

  • 刚刚意识到这个问题是针对 C# 发布的,而我误认为它是针对 VB 的。我现在已经用 C# 等效替换了上面的代码。
  • +1 使用事件。它效率更高。像往常一样的好代码 Pradeep :)
  • 虽然使用事件来确定进程何时退出是一个很好的方法。但是,它不能确定该过程是否已经开始。在多线程环境中,当进程实际上正在运行时,MyProcessIsRunning 可能为假。
  • 我最终做了这样的事情。我仍然感到困惑,这不在 API 中。
【解决方案2】:

Process.GetProcesses();中搜索你的进程,该方法返回的列表给出了当前机器上运行的所有进程。

【讨论】:

    【解决方案3】:

    您可以使用Process.GetProcesses 方法(在System.Diagnostics namespace) 来获取当前在 PC 上运行的进程列表。

    Process.GetProcessesByName() 也可以用来获取列表 特定程序的实例。

    // Get all instances of Notepad running on the local computer.
    Process [] localByName = Process.GetProcessesByName("YourProcess");
    

    【讨论】:

      【解决方案4】:

      您可以检查进程中是否至少有一个thread。这将表明该进程已启动并正在运行。

      编辑:
      您也可以查看进程Id。如果进程没有启动,它会抛出异常。

      编辑 2:
      其实Threads如果没有设置Id也会抛出异常:

      bool ProcessIsRunning(Process p)
      {
        bool isRunning;
        try {
          isRunning = !p.HasExited && p.Threads.Count > 0;
        }
        catch(SystemException sEx)
        {
          isRunning = false;
        }
        catch(PlatformNotSupportedException pnsEx)
        {
          throw;
        }
      
        return isRunning;
      }
      

      【讨论】:

      • p.HasExited 如果没有启动会抛出异常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      相关资源
      最近更新 更多