2010-05-10 5 views
25

Moja aplikacja C# ma kilku pracowników w tle. Czasami jeden pracownik w tle strzela innym. Kiedy pierwszy pracownik tła zakończy pracę i zostanie wywołane zdarzenie RunWorkerCompleted, na którym wątku zostanie wywołane to zdarzenie, zostanie wywołany interfejs użytkownika lub pierwszy pracownik tła, z którego został wywołany RunWorkerAsync? Korzystam z Microsoft Visual C# 2008 Express Edition. Wszelkie przemyślenia lub sugestie będą mile widziane. Dzięki.BackgroundWorker RunWorkerCompleted Event

Odpowiedz

57

Jeśli BackgroundWorker został utworzony z wątku interfejsu użytkownika, wówczas zdarzenie RunWorkerCompleted zostanie również wywołane w wątku interfejsu użytkownika.

Jeśli został utworzony z wątku tła, zdarzenie zostanie podniesione na niezdefiniowanym wątku tła (niekoniecznie ten sam wątek, chyba że używasz niestandardowego SynchronizationContext).

Co ciekawe, nie wydaje się to być dobrze udokumentowane w witrynie MSDN. Najlepszym odniesienia udało mi się znaleźć to here:

Preferowanym sposobem realizacji wielowątkowości w aplikacji jest użycie komponentu BackgroundWorker. Komponent BackgroundWorker używa modelu sterowanego zdarzeniami dla wielowątkowości. Wątek tła uruchamia program obsługi zdarzeń DoWork, a wątek, który tworzy elementy sterujące, uruchamia programy obsługi zdarzeń ProgressChanged i RunWorkerCompleted. Możesz wywoływać formanty za pomocą programów obsługi zdarzeń ProgressChanged i RunWorkerCompleted.

+0

Czy to właśnie tutaj utworzono kontrolę? Wszyscy moi pracownicy w tle są instancyjni (prawdopodobnie) z wątku UI w domyślnej funkcji 'InitializeComponent()'. –

+0

@ Jim: Tak, nieco słabe sformułowanie na oryginalnym ujęciu; w rzeczywistości jest to wątek, który utworzył 'BackgroundWorker', który będzie odbierać zdarzenia i musisz wywołać' RunWorkerAsync' z tego samego wątku. Dla celów związanych ze zdrowiem, powinien to być ogólnie wątek interfejsu użytkownika. – Aaronaught

+8

To nie jest poprawne. Zostanie on podniesiony tylko w wątku UI, jeśli wątek interfejsu użytkownika utworzył instancję BGW. Jeśli wątek utworzył BGW, zostanie on podniesiony do dowolnego wątku wątku. –