La fermeture de l’application arrête-t-elle tous les BackgroundWorkers actifs?

Question simple, pour répéter le titre:

La fermeture de l’application WinForms arrête-t-elle tous les BackgroundWorkers actifs?

Oui.

BackgroundWorker.RunWorkerAsync appelle simplement BeginInvoke sur un délégué interne, qui met ensuite la demande en queue dans le ThreadPool . Puisque tous les threads ThreadPool sont en arrière – plan , oui, cela se terminera à la fin de l’application.

Cependant, gardez à l’esprit que:

  1. En “fermant l’application WinForms”, je présume la fermeture de l’ instance de Form principale (généralement celle transmise à Application.Run dans la classe Program générée automatiquement par Visual Studio). Si vous avez une fenêtre enfant avec un travailleur d’arrière-plan, cela n’arrêtera pas automatiquement BackgroundWorker .

  2. Laisser un thread en arrière-plan être abandonné à la fermeture de l’application n’est pas la méthode recommandée pour mettre fin au thread, car rien ne garantit qu’il sera abandonné. Un meilleur moyen serait de signaler le travailleur avant la fermeture, d’attendre qu’il se termine normalement, puis de quitter.

Plus d’informations: Delegate.BeginInvoke , MSDN sur le regroupement de threads , Thread.IsBackground

La seule manière dont un thread peut continuer à s’exécuter après que votre thread principal (UI) soit arrêté est si elle a été créée explicitement, en créant une nouvelle instance de Thread et en définissant IsBackground sur false. Si vous ne le faites pas (ou si vous utilisez le ThreadPool qui génère des threads d’arrière-plan – ou le BackgroundWorker qui utilise également le ThreadPool en interne), votre thread sera un thread d’arrière-plan et se terminera à la fin du thread principal.

Les threads BackgroundWorker sont des threads d’arrière-plan (threads ThreadPool ), qui meurent à la mort de l’application .

Oui, il sera. J’ai écrit ce formulaire simple, et fermer le formulaire quitte l’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); } } } 

Si l’application se ferme complètement (comme rien ne l’empêche de l’éteindre), vos antécédents seront également partis.

Une fois le processus terminé, tous les threads associés disparaissent également.

Tout d’abord, pour simplifier cette réponse:

Lorsqu’un processus est fermé, tous ses threads sont terminés. Cela ne fait aucun doute.

La question, telle que je l’interprète, devient ainsi:

BackgroundWorker instances de BackgroundWorker toujours en cours empêcheront-elles une application de se fermer?

La réponse à cette question est: non, ils ne le feront pas.

Je pense que oui. Parce que les threads sont associés au processus et si le processus est fermé, tous les threads doivent se terminer.