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()的新线程?如果没有,为什么继续?
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线程上。