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

C# 在应用程序关闭时终止应用程序进程,c#,C#,在使用“应用程序关闭”按钮关闭应用程序后,我遇到了一些有关终止应用程序进程的问题 该应用程序使用多个表单并利用MDI父/子接口 在每个表单.cs文件中,我都有以下代码(用实际表单名称替换FormName): 如果关闭应用程序启动后打开的第一个窗口,则进程将按预期结束。但是,如果我使用按钮(new MDI child)打开一个新表单并单击“应用程序关闭”按钮,则应用程序将关闭,但该流程仍在任务管理器中处于活动状态 我已尝试使用应用程序.Exit代替环境.Exit(0)但没有效果 当任何表单关闭时,

在使用“应用程序关闭”按钮关闭应用程序后,我遇到了一些有关终止应用程序进程的问题

该应用程序使用多个表单并利用MDI父/子接口

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

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

我已尝试使用
应用程序.Exit
代替
环境.Exit(0)
但没有效果


当任何表单关闭时,有什么方法可以终止整个申请过程吗?

您可以尝试这样的方法来确保所有表单都关闭

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();
    }
}
如果关闭所有窗体不起作用,则需要确保在应用程序关闭时停止启动的任何线程,因为进程在所有线程停止之前不会停止。

用于获取所有窗体并将其全部关闭

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

在所有窗体上调用
Close
。您的应用程序中是否正在生成线程?我是否在
\u Closing
方法中调用
Close
?如果是这样,我在每个关闭方法中添加了
this.Close()
,但不起作用。@abhitalks,否定。不过,我尝试了你的建议,我收到此错误消息:
“System.Windows.Forms.FormCollection”不包含“ToArray”的定义,并且找不到接受“System.Windows.Forms.FormCollection”类型的第一个参数的扩展方法“ToArray”(是否缺少using指令或程序集引用?
Aha,您需要在文件顶部使用System.Linq,这是一种Linq扩展方法。多读一些,或者用谷歌搜索一下
private void CloseForm(Form form)
{
    if (form.IsDisposed) {
        return;
    }

    if (form.InvokeRequired) {
        form.Invoke((MethodInvoker)form.Close);
    }
    else {
        form.Close();
    }
}