2

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

该应用程序使用多种形式并利用 MDI 父/子接口。

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

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

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

我曾尝试使用Application.Exit代替Environment.Exit(0)但无济于事。

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

4

2 回答 2

1

用于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();
    }
}
于 2013-08-01T07:33:01.137 回答
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();
    }
}

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

于 2013-08-01T07:30:13.807 回答