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

Kor*_*tak 11 c# backgroundworker winforms

简单的问题,重复标题:

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

Gro*_*roo 18

是的,它确实.

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

但是,请记住:

  1. 通过"关闭WinForms应用程序"我假设关闭Form实例(通常是由Visual Studio自动生成Application.RunProgram类中传递的实例).如果您有一个带后台工作程序的子窗口,它将不会BackgroundWorker自动停止.

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

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


Yan*_*rtz 7

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


小智 6

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