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

lar*_*moa 4 .net c# system.diagnostics

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

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

Arn*_* F. 6

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


Pra*_*mar 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!");
}
Run Code Online (Sandbox Code Playgroud)

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