c# - 如何判断一个进程是否已经启动但还没有退出?

标签 c# .net system.diagnostics

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

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

最佳答案

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

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

// 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# - 如何判断一个进程是否已经启动但还没有退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9719905/

相关文章:

C# 获取线程类与主类通信

c# - 与 C# 相比,F# 的性能如何?

c# - ANTLR C# 找不到 'IAstRuleReturnScope'

.net - 没有配置文件时 System.Configuration.ConfigurationManager 指向哪里?

.net - 如何在 ASP.NET MVC 中获取当前虚拟路径?

C# System.Net 跟踪日志 - 只跟踪一种方法而忽略其他方法?

C# 循环限制为 50 遍

c# - Windows 窗体和 C# 中控件的动态自上而下列表?

vb.net - 如何有选择地与程序的两个实例通信?

c# - 查询事件日志时如何创建EventBookmark