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

时间:2009-11-06 13:41:38

标签: c# winforms backgroundworker

简单的问题,重复标题:

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

8 个答案:

答案 0 :(得分:18)

是的,确实如此。

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

但是,请记住:

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

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

  3. 更多信息:Delegate.BeginInvokeMSDN on Thread PoolingThread.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)

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