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

时间:2014-09-17 14:58:16

标签: c# multithreading exit

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

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

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()下面的行,并且在上面的示例中,尝试向Log写入一些内容,Log已经由FormClosing()方法处理。

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

3 个答案:

答案 0 :(得分:3)

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

  

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

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

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

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

答案 1 :(得分:1)

不,它不会启动新线程。它也不会立即杀死UI线程。 Application.Exit的重点是优雅地退出应用程序。将要求关闭所有表单,清理资源,所有表单都通过主应用程序循环。当应用程序循环接下来变为空闲时,而不是等待更多消息,它将停止泵送消息,并且应用程序将在调用创建消息循环的Appliaction.Run之后继续运行。然后该线程可以继续做任何事情(通常结束;除非您添加了更多代码)。

答案 2 :(得分:1)

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

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