问题
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:
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
回答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