据我了解,如果我设置_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
将强制它在表单退出时关闭的表单启动的。
我是否遗漏或误解了某些内容?
答案 0 :(得分:2)
根据documentation后台线程,不会阻止进程终止。无论这可能意味着什么,都无法保证线程能够很好地完成&#34;
答案 1 :(得分:2)
严格地说,线程是后台线程阻止它保持进程活着。只要至少有一个非后台线程在运行,该过程就会一直存在。 UI线程是非后台线程,并且在关闭主线程的winform应用程序中默认将导致该线程完成。
所以现在我们已经拥有了所有这些,我们可以看到,通常情况下,关闭主表格将会杀死&#34;后台进程,但有许多事情可以阻止这一点。
主线程结束并不必然意味着应用程序将结束,UI线程将终止。可以根据不同的标准调整应用程序的行为,或者在应用程序完成运行后添加代码以在Main
中运行。
您还可以创建其他非UI线程,如果这样做,他们将保持整个过程(以及所有后台线程)的活动。
答案 2 :(得分:0)
IsBackground = true表示当主线程结束时(以及所有其他非后台线程) - 它将停止。但是这些线程是什么?我相信当你关闭你的mainform时,你仍然有一个非后台运行的线程可能是这个表单被创建和ititialized。