简单的问题,重复标题:
关闭WinForms应用程序会停止所有活动的BackgroundWorkers吗?
答案 0 :(得分:18)
是的,确实如此。
BackgroundWorker.RunWorkerAsync
只需在内部委托上调用BeginInvoke
,然后将请求排到ThreadPool
。由于所有ThreadPool
个线程都是background,是的,它将在应用程序结束时结束。
但是,请记住:
通过“关闭WinForms应用程序”,我假设关闭主Form
实例(通常是Application.Run
传递给Program
的实例由Visual Studio自动生成的类)。如果您有一个带后台工作者的子窗口,它将不会自动停止BackgroundWorker
。
在应用程序退出时让后台线程中止是不建议的结束线程的方法,因为您无法保证它将被中止。一个更好的方法是在关闭前向工人发出信号,等待它优雅地完成,然后退出。
更多信息:Delegate.BeginInvoke,MSDN on Thread Pooling,Thread.IsBackground
答案 1 :(得分:7)
在主(UI)线程停止后,线程可以继续执行的唯一方法是通过创建新的Thread实例并将IsBackground设置为false来明确创建它。如果你没有(或者如果你使用ThreadPool生成后台线程 - 或者BackgroundWorker也在内部使用ThreadPool)你的线程将是一个后台线程,并将在主线程结束时终止。
答案 2 :(得分:6)
BackgroundWorker线程是后台线程(ThreadPool线程),which die when the application dies。
答案 3 :(得分:1)
是的,它会的。我写了这个简单的表单,关闭表单退出了应用程序:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
Thread.Sleep(100);
}
}
}
答案 4 :(得分:0)
如果应用程序完全关闭(因为没有任何东西阻止它关闭),你的后台工作人员也将会离开。
答案 5 :(得分:0)
一旦过程消失,所有相关的线程也会消失。
答案 6 :(得分:0)
首先,只是为了使这个答案变得简单:
当进程关闭时,其所有线程都已终止。毫无疑问。
正如我所解释的那样,问题就变成了:
仍在运行的
BackgroundWorker
实例会阻止应用程序关闭吗?
问题的答案是:不,他们不会。
答案 7 :(得分:-1)
我想是的。因为线程与进程相关联,如果进程关闭,所有线程都必须结束。