如何确定流程是否已启动但尚未退出?

时间:2012-03-15 12:41:39

标签: c# .net system.diagnostics

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

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

4 个答案:

答案 0 :(得分:6)

Process.GetProcesses();中搜索您的流程,此方法返回的列表会提供当前在计算机上运行的所有流程。

答案 1 :(得分:6)

虽然其他人建议的方法可行,但它并不是处理此类事情的最有效方法。如果您保持循环检查进程是否已退出,则会浪费大量系统资源。 您应关注的是只知道流程何时退出,而不是坐下来检查流程是否已退出。所以,正确的方法是处理事件。

下面的代码说明了如何使用事件。

// 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。我更新了上面的代码,以显示如何轻松设置这样的标志。

答案 2 :(得分:2)

您可以检查过程中至少有一个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;
}

答案 3 :(得分:2)

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

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

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