在应用程序关闭时终止申请流程

时间:2013-08-01 07:10:30

标签: c#

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

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

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

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

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

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

有什么办法可以在关闭任何表格时终止整个申请流程吗?

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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();
    }
}

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