Does closing the application stops all active BackgroundWorkers?

杀马特。学长 韩版系。学妹 提交于 2019-11-30 16:50:02

问题


Simple question, to repeat the title:

Does closing the WinForms application stops all active BackgroundWorkers?


回答1:


Yes, it does.

BackgroundWorker.RunWorkerAsync simply calls BeginInvoke on a internal delegate, which in turn queues the request to the ThreadPool. Since all ThreadPool threads are background, yes, it will end when the application ends.

However, keep in mind that:

  1. By "closing the WinForms application" I am presuming closing the main Form instance (that's generally the one passed to Application.Run in the Program class autogenerated by Visual Studio). If you have a child window with a background worker, it will not stop its BackgroundWorker automatically.

  2. Letting a background thread be aborted on application exit is not the recommended way to end the thread, as you have no guarantees where it will be aborted. A much better way would be to signal the worker before closing, wait for it to finish gracefully, and then exit.

More info: Delegate.BeginInvoke, MSDN on Thread Pooling, Thread.IsBackground




回答2:


The only way a thread can go on executing after your main (UI) thread has stopped is if it has been created explicitely, by creating a new Thread instance and setting the IsBackground to false. If you don't (or if you use the ThreadPool which spawns background threads - or the BackgroundWorker which also uses the ThreadPool internally) your thread will be a background thread and will be terminated when the main thread ends.




回答3:


BackgroundWorker threads are background threads (ThreadPool threads), which die when the application dies.




回答4:


Yes, it will. I wrote this simple form, and closing the form exits the application:

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



回答5:


If the application completely closes (as in nothing is preventing it from shutting down) your background workers will also be gone.




回答6:


Once the process is gone all associated threads are gone as well.




回答7:


First of all, just to make this answer simple:

When a process has closed, all of its threads have terminated. There's no question about this.

The question, as I interpret it, thus becomes:

Will still-running BackgroundWorker instances prevent an application from closing?

The answer to that question is: No, they won't.




回答8:


I think yes. Because threads are associated with process and if the process is closed all threads has to end.



来源:https://stackoverflow.com/questions/1687677/does-closing-the-application-stops-all-active-backgroundworkers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!