繁体   English   中英

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

[英]How to determine if a Process has started but not yet exited?

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

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

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

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

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

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

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

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

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

您可以检查过程中至少有一个线程 这表明该过程已启动并正在运行。

编辑:
您还可以检查进程ID 如果进程尚未启动,它将抛出异常。

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM