在应用程序关闭时终止应用程序进程

本文关键字:应用程序 终止 进程 | 更新日期: 2023-09-27 18:25:42

使用应用程序关闭按钮关闭应用程序后,我遇到了终止应用程序进程的问题。

该应用程序使用多个窗体,并使用MDI父/子界面。

在每个表单.cs文件中,我都有以下代码(用实际表单名称替换FormName):

private void FormName_Closing(object sender, FormClosingEventArgs e)
{
    Environment.Exit(0);
}   

如果我关闭应用程序启动后打开的第一个窗口,则该过程将按预期结束。但是,如果我用按钮(新的MDI子窗体)打开一个新窗体,然后单击应用程序关闭按钮,应用程序将关闭,但该进程在任务管理器中仍然处于活动状态。

我试过用Application.Exit代替Environment.Exit(0),但没有用。

当任何表格关闭时,有没有办法终止整个申请过程?

在应用程序关闭时终止应用程序进程

使用Application.OpenForms获取所有表单,并将其全部关闭。

public void CloseAllForms()
{
    foreach (var form in Application.OpenForms.ToArray()) {
        CloseForm(form);
    }
}

这里的一个微妙问题是,表单可以从不同的线程打开,在这种情况下,简单地从主线程关闭它们是行不通的——你需要通过Invoke:关闭这样的表单

private void CloseForm(Form form)
{
    if (form.IsDisposed) {
        return;
    }
    if (form.InvokeRequired) {
        form.Invoke((MethodInvoker)form.Close);
    }
    else {
        form.Close();
    }
}

您可以尝试这样的操作来确保所有表单都关闭。

private void FormName_Closing(object sender, FormClosingEventArgs e)
{
    Form parent = this;
    while (parent.MdiParent != null)
        parent = parent.MdiParent;
    closeChildren(parent);
    parent.Close();
}   
static void closeChildren(Form parent)
{
    foreach (var child in parent.MdiChildren)
    {
        closeChildren(child);
        child.Close();
    }
}

如果关闭所有表单都不起作用,那么您需要确保在应用程序关闭时启动的任何线程都会停止,因为在所有线程停止之前,进程不会停止。