为什么后台线程在窗体关闭时不退出

本文关键字:退出 窗体 后台 线程 为什么 | 更新日期: 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 表示当主线程(以及所有其他非后台线程)结束时 - 它将停止。但是这些线程是什么?我相信当您关闭主窗体时,您仍然有一个非后台线程正在运行,可能是创建并对其进行迭代的线程。