Application.Exit():它是否启动一个新线程(我的程序继续并行执行)

本文关键字:线程 新线程 我的 继续 并行执行 一个 程序 Exit 是否 Application 启动 | 更新日期: 2023-09-27 18:22:09

我有一个多线程应用程序,在主UI线程和其他后台线程中,我都有调用application.Exit()的停止方法。

奇怪的是,在调用之后,程序继续到下一行(然后最终退出)。这个明显的问题可以用下面的简单代码来解释:

if (XYZ) Application.Exit();
Globals.Instance.LoggerDictionary["ApplicationLog"].Log("Bla bla...");

这个:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        var button = sender as Button;
        if (button != null && string.Equals(button.Name, @"CloseButton"))
        {
            //FormClosing event raised by a user created button action
        }
        else
        {
            //FormClosing event raised by program or the X in top right corner
            Globals.Instance.LoggerDictionary["ApplicationLog"].Dispose();
            Globals.Instance.LoggerDictionary["OtherLog"].Dispose();
            MemoryHandler.Instance.Dispose();
        }
    }

如图所示,FormClosing方法确保完成非托管资源的清理。因此,在许多情况下,应用程序会移动到application.Exit()下面的行,并在上面的示例中,尝试向日志中写入一些内容,该日志已由FormClosing()方法处理。

因此,我的问题是:Application.Exit()是否会生成一个运行FormClosing()的新线程?如果没有,为什么继续?

Application.Exit():它是否启动一个新线程(我的程序继续并行执行)

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.exit(v=vs.110).aspx

通知所有消息泵必须终止,然后在处理完消息后关闭所有应用程序窗口。

此方法不会终止进程。即时终止很少是有用的关闭模式,因为不清楚会跳过哪些有用的关闭操作。

如果此方法没有终止进程,那么显然您的代码必须继续运行。

这是正常的,也是关闭应用程序的正确方式。如果您想跳过某些逻辑,请设置一个标志bool isShuttingDown并对其作出反应。

不,它不会启动新线程。它也不会立即终止UI线程。Application.Exit的全部目的是优雅地退出应用程序。所有表格都将被要求关闭,资源将被清理,所有这些都将通过主应用程序循环。当应用程序循环下一次变为空闲时,它将停止泵送消息,而不是等待更多消息,并且在调用最初创建消息循环的Appliaction.Run之后,应用程序将继续运行。然后,该线程可以继续执行任何操作(通常结束;除非您添加了更多代码)。

不,它不会产生额外的线程。查看它将调用每个窗体的FormClosing事件的函数内部的引用源,然后将控制权返回给调用者。一旦调用程序完成并且控制返回到消息循环,程序就会实际关闭。

所有这些都发生在单个UI线程上。