2010-05-10 5 views
25

Mon application C# a plusieurs travailleurs d'arrière-plan. Parfois, un travailleur de fond en déclenchera un autre. Lorsque le premier agent d'arrière-plan est terminé et que l'événement RunWorkerCompleted est déclenché, sur quel thread cet événement se déclenchera-t-il, l'interface utilisateur ou le premier agent d'arrière-plan à partir duquel RunWorkerAsync a été appelé? J'utilise Microsoft Visual C# 2008 Express Edition. Toute idée ou suggestion que vous pourriez avoir serait appréciée. Merci.BackgroundWorker RunWorkerCompleted, événement

Répondre

57

Si le 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 (pas nécessairement le même thread, sauf si vous utilisez un SynchronizationContext personnalisé).

Il est intéressant de noter que cela ne semble pas très bien documenté sur MSDN. La meilleure référence que j'ai pu trouver était here:

La meilleure façon de mettre en œuvre multithreading dans votre application est d'utiliser le composant BackgroundWorker. Le composant BackgroundWorker utilise un modèle piloté par événement pour le multithreading. Le thread d'arrière-plan exécute votre gestionnaire d'événements DoWork et le thread qui crée vos contrôles exécute vos gestionnaires d'événements ProgressChanged et RunWorkerCompleted. Vous pouvez appeler vos contrôles depuis vos gestionnaires d'événements ProgressChanged et RunWorkerCompleted.

+0

Serait-ce là où le contrôle a été instancié? Tous mes travailleurs d'arrière-plan sont instanciés (vraisemblablement) à partir du thread UI dans la fonction 'InitializeComponent()' par défaut. –

+0

@Jim: Oui, un libellé légèrement médiocre sur la prise d'origine; c'est en fait le thread qui a créé 'BackgroundWorker' qui recevra les événements, et vous devez appeler' RunWorkerAsync' depuis le même thread. Pour des raisons de santé mentale, cela devrait généralement être le thread de l'interface utilisateur. – Aaronaught

+8

Ce n'est pas correct. Il ne sera levé sur le thread UI que si le thread UI a créé l'instance BGW. Si un thread a créé le BGW, il sera levé sur un thread threadpool arbitraire. –

Questions connexes