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

C# 关闭应用程序是否会停止所有活动的BackgroundWorker?,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,简单问题,重复标题: 关闭WinForms应用程序是否会停止所有活动的后台工作人员?如果应用程序完全关闭(因为没有任何东西阻止它关闭),您的后台工作人员也将消失。我想是的。因为线程与进程关联,如果进程关闭,则所有线程都必须结束。一旦进程结束,所有关联的线程也会结束。是的,它会结束 BackgroundWorker.RunWorkerAsync只需对内部委托调用BeginInvoke,然后将请求排入ThreadPool队列。因为所有ThreadPool线程都是,所以它将在应用程序结束时结束 但是,

简单问题,重复标题:


关闭WinForms应用程序是否会停止所有活动的后台工作人员?

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

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

一旦进程结束,所有关联的线程也会结束。

是的,它会结束

BackgroundWorker.RunWorkerAsync
只需对内部委托调用
BeginInvoke
,然后将请求排入
ThreadPool
队列。因为所有
ThreadPool
线程都是,所以它将在应用程序结束时结束

但是,请记住:

  • “关闭WinForms应用程序”意味着关闭主
    表单
    实例(通常是传递给
    应用程序的实例。在Visual Studio自动生成的
    程序
    类中运行
    )。如果您的子窗口具有后台工作程序,则它不会自动停止其
    BackgroundWorker

  • 允许在应用程序退出时中止后台线程不是结束线程的推荐方法,因为您无法保证在哪里中止后台线程。一个更好的方法是在关门前向工人发出信号,等待它优雅地结束,然后退出


  • 更多信息:,

    BackgroundWorker线程是后台线程(线程)

    在主(UI)线程停止后,线程可以继续执行的唯一方法是,如果它是显式创建的,则创建一个新的线程实例并将IsBackground设置为false。如果您不这样做(或者如果您使用生成后台线程的线程池,或者BackgroundWorker也在内部使用线程池),那么您的线程将是后台线程,并且将在主线程结束时终止。

    首先,简单回答一下:

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

    按照我的解释,这个问题就变成了:

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


    这个问题的答案是:不,他们不会。是的,会的。我编写了这个简单的表单,关闭表单将退出应用程序:

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

    这是一种循环回答。如果后台工作程序在应用程序关闭时未自动停止,则它们将阻止应用程序关闭。除非其
    IsBackground
    属性设置为
    false
    ,这将阻止进程终止。因此答案是正确的;)