2009-11-06 97 views

回答

18

是的,它的确如此。

BackgroundWorker.RunWorkerAsync只需在内部代理上调用BeginInvoke,该内部代理又将请求排入ThreadPool。由于所有的ThreadPool线程都是background,是的,它将在应用程序结束时结束。

但是,请记住:

  1. 通过“关闭WinForms应用程序”我假设关闭主要Form实例(这是一般人在Program类传递给Application.Run通过视觉自动生成工作室)。如果您有带后台工作人员的子窗口,则不会自动停止BackgroundWorker

  2. 让应用程序退出时中止后台线程是而不是推荐的方式来结束线程,因为您没有保证它会中止的地方。更好的方法是在关闭之前发信号给工作人员,等待它正常完成,然后退出。

更多信息:Delegate.BeginInvokeMSDN on Thread PoolingThread.IsBackground

0

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

+3

这是一种圆形的答案。如果后台工作人员在应用程序关闭时没有自动停止,他们将阻止应用程序关闭。 – 2009-11-06 13:46:59

-1

我想是的。由于线程与进程关联,并且进程关闭,所有线程都必须结束。

0

一旦进程结束,所有相关的线程都不见了。

+0

除非他们的'IsBackground'属性设置为'false'。 – Groo 2009-11-06 13:55:30

+0

这会阻止进程终止。所以答案成立;) – dkackman 2009-11-06 16:28:45

7

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

0

首先,只是为了让这个答案很简单:

当一个进程已经关闭,其全部线程已终止。这是毫无疑问的。

的问题,因为我解释它,于是就变成了:

还会运行BackgroundWorker情况下,防止在应用程序关闭?

的回答问题是:不,他们不会。

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); 
     } 
    } 
} 
相关问题