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:
By "closing the WinForms application" I am presuming closing the main
Form
instance (that's generally the one passed toApplication.Run
in theProgram
class autogenerated by Visual Studio). If you have a child window with a background worker, it will not stop itsBackgroundWorker
automatically.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.
精彩评论