为什么后台线程在表单关闭时不退出?

时间:2015-06-19 20:18:56

标签: c# multithreading

据我了解,如果我设置_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将强制它在表单退出时关闭的表单启动的。

我是否遗漏或误解了某些内容?

3 个答案:

答案 0 :(得分:2)

根据documentation后台线程,不会阻止进程终止。无论这可能意味着什么,都无法保证线程能够很好地完成&#34;

答案 1 :(得分:2)

严格地说,线程是后台线程阻止它保持进程活着。只要至少有一个非后台线程在运行,该过程就会一直存在。 UI线程是非后台线程,并且在关闭主线程的winform应用程序中默认将导致该线程完成。

所以现在我们已经拥有了所有这些,我们可以看到,通常情况下,关闭主表格将会杀死&#34;后台进程,但有许多事情可以阻止这一点。

主线程结束并不必然意味着应用程序将结束,UI线程将终止。可以根据不同的标准调整应用程序的行为,或者在应用程序完成运行后添加代码以在Main中运行。

您还可以创建其他非UI线程,如果这样做,他们将保持整个过程(以及所有后台线程)的活动。

答案 2 :(得分:0)

IsBackground = true表示当主线程结束时(以及所有其他非后台线程) - 它将停止。但是这些线程是什么?我相信当你关闭你的mainform时,你仍然有一个非后台运行的线程可能是这个表单被创建和ititialized。