关闭应用程序是否会停止所有活动的BackgroundWorkers?

简单的问题,重复标题:

关闭WinForms应用程序是否会停止所有活动的BackgroundWorkers?

是的,它确实。

BackgroundWorker.RunWorkerAsync只是在内部委托上调用BeginInvoke ,而内部委托又将请求排队到ThreadPool 。 由于所有ThreadPool线程都是后台 ,是的,它将在应用程序结束时结束。

但是,请记住:

  1. 通过“关闭WinForms应用程序”,我假设关闭了主要的Form实例 (通常是在Visual Studio自动生成的Program类中传递给Application.Run 实例 )。 如果您有一个带后台工作程序的子窗口,它将不会自动停止其BackgroundWorker

  2. 允许在应用程序退出时中止后台线程不是建议的结束线程的方法,因为您无法保证它将被中止。 一个更好的方法是在关闭之前发出工作信号,等待它优雅地完成,然后退出。

更多信息: Delegate.BeginInvoke , 线程池上的MSDN , Thread.IsBackground

在主(UI)线程停止后,线程可以继续执行的唯一方法是通过创建新的Thread实例并将IsBackground设置为false来明确创建它。 如果你没有(或者如果你使用ThreadPool生成后台线程 – 或者BackgroundWorker也在内部使用ThreadPool)你的线程将是一个后台线程,并在主线程结束时终止。

BackgroundWorker线程是后台线程( ThreadPool线程), 它在应用程序死亡时死亡 。

是的,它会的。 我写了这个简单的表单,关闭表单退出应用程序:

 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); } } } 

如果应用程序完全关闭(因为没有任何东西阻止它关闭),你的后台工作人员也将会消失。

一旦过程消失,所有相关的线程也会消失。

首先,只是为了使这个答案变得简单:

当进程关闭时,其所有线程都已终止。 毫无疑问。

因此,正如我所解释的那样,问题变为:

仍在运行的BackgroundWorker实例是否会阻止应用程序关闭?

这个问题的答案是:不,他们不会。

我想是的。 因为线程与进程相关联,如果进程关闭,则所有线程都必须结束。