为什么后台线程在窗体关闭时不退出
本文关键字:退出 窗体 后台 线程 为什么 | 更新日期: 2023-09-27 17:57:06
据我了解,如果我设置_myThread.isBackground = true
那么线程应该在表单关闭时退出。 不幸的是,我没有发现我的线程正在退出。 这是我的代码的样子:
private void MainForm_Load(object sender, EventArgs e)
{
// <snip>
daemon = new Daemon();
// <snip>
}
public Daemon()
{
// Start the main thread which will do most of the connection checking and work
_mainThread = new Thread(() => MainThread(this));
_mainThread.IsBackground = true;
_mainThread.Start();
}
/// <summary>
/// This is the work that the main thread does.
/// </summary>
private void MainThread(Daemon daemon)
{
while(true)
{
try
{
// Do things.
Thread.Sleep(2000); // Sleep for a bit to not hammer.
}
catch (Exception e)
{
Logger.Exception(e);
}
}
}
我认为由于线程是从表单开始的,因此设置isBackground=true
会强制它在表单退出时关闭。
我是否遗漏或误解了某些内容?
严格来说,线程是后台线程会阻止它保持进程的活动状态。 只要至少有一个非后台线程正在运行,该过程就会持续存在。 UI 线程是非后台线程,默认情况下,在 winform 应用程序中关闭主线程将导致该线程完成。
因此,现在我们已经有了所有这些,我们可以看到,通常关闭主窗体将"杀死"后台进程,但是有很多事情可以阻止这种情况。
主线程结束并不一定意味着应用程序将结束,UI 线程将终止。 可以将应用程序的行为调整为在不同的条件下结束,或者在应用程序完成运行后添加代码以在Main
中运行。
您还可以创建其他非 UI 线程,如果这样做,它们将使整个过程(以及所有后台线程)保持活动状态。
根据文档背景线程不会阻止进程终止。不能保证线程会"很好地"完成,无论这意味着什么。
IsBackground = true 表示当主线程(以及所有其他非后台线程)结束时 - 它将停止。但是这些线程是什么?我相信当您关闭主窗体时,您仍然有一个非后台线程正在运行,可能是创建并对其进行迭代的线程。