开发者

Does closing the application stops all active BackgroundWorkers?

开发者 https://www.devze.com 2022-12-10 22:13 出处:网络
Simple question, to repeat the title: Do开发者_运维问答es closing the WinForms application stops all active BackgroundWorkers?Yes, it does.

Simple question, to repeat the title:

Do开发者_运维问答es closing the WinForms application stops all active BackgroundWorkers?


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


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.


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


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


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


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


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.


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

0

精彩评论

暂无评论...
验证码 换一张
取 消