2010-11-18 3 views
9

J'ai une application graphique qui a besoin d'exécuter de longs calculs (pensez à une minute ou plus) et la façon dont il traite cela est en donnant le calcul à un travailleur de fond. (Cette partie est très bien)sur quel thread le gestionnaire d'événements terminé par backgroundworker est-il exécuté?

La question que j'est si je fais quelque chose comme: this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse); Est-ce que doSomethingElse va être exécuté sur le thread d'interface utilisateur principal ou sur tout autre élément du pool de threads sur lequel le worker d'arrière-plan s'est exécuté?

merci pour toute aide que vous pouvez fournir.

+1

Vous pouvez écrire le 'System.Threading.Thread.CurrentThread.ManagedThreadId' à la fenêtre de sortie dans le' UI', '' DoWork' et WorkCompleted' pour confirmer – PostMan

Répondre

6

Il va être exécuté dans le même thread que BackgroundWorker, c'est-à-dire le plus souvent le thread de l'interface utilisateur.

+0

Ok pour la 2ème partie, mais un Bgw (ou tout autre objet) n'est pas "dans un fil". –

+1

Désolé, le fil qui l'a engendré aurait été une meilleure formulation – Homde

+0

Cela soulève un point intéressant en fait .. si vous utilisez le concepteur graphique GUI dans une application Windows Forms pour déclarer un BackgroundWorker, l'objet BackgroundWorker réel finit sur le pile pour le fil de l'interface utilisateur ou sur le tas? –

5

est doSomethingElse va être exécuté sur le thread principal de l'interface utilisateur

Oui, c'est la principale raison d'être pour un BackgroundWorker. Il a 3 événements, seul DoWork sera exécuté sur un thread séparé (ThreadPool). Terminé et ProgressChanged seront rassemblés dans le thread "principal".

4

Si BackgroundWorker a été créé à partir du thread d'interface utilisateur, l'événement RunWorkerCompleted sera également déclenché sur le thread d'interface utilisateur.

S'il a été créé à partir d'un thread d'arrière-plan, l'événement sera déclenché sur un thread d'arrière-plan non défini.

Voir ce post et ce problème de connexion pour plus d'informations.

https://stackoverflow.com/a/2806824/279999

http://connect.microsoft.com/VisualStudio/feedback/details/116930/backgroundworker-components-progresschanged-and-runworkercompleted-event-run-on-wrong-thread

+0

En effet! La première fois que j'ai été confondu ce fait lorsque mon application a bien fonctionné, et l'événement Completed a été invoqué à partir du thread principal de l'interface utilisateur. Mais mes tests unitaires ont échoué dans la mesure où l'événement Completed a été appelé à partir du thread d'arrière-plan, et non du thread de test principal –

Questions connexes