2010-11-18 25 views
9

Uzun hesaplamaları çalıştırması gereken bir GUI uygulamasına sahibim (bir dakika veya daha fazla düşünün) ve bununla ilgilenme şekli, bir arka plan çalışanına hesaplamasıdır. Ben böyle bir şey yaparsanızbackgroundworker tamamlanmış olay işleyicisi hangi iş parçacığı üzerinde çalışır?

Ben sorudur (bu kısmı gayet): this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse);

doSomethingElse, ana UI iş parçacığında mı çalıştırılacak yoksa iş parçacığı havuzunda ne olursa olsun arka plan çalışanı çalışıyor mu?

Sağladığınız her türlü yardım için teşekkür ederiz.

+1

Sen hiç Tamam – PostMan

cevap

6

BackgroundWorker'ın içinde olduğu, yani çoğu zaman UI iş parçacığı içinde olduğu aynı iş parçacığında çalıştırılacak.

+0

onaylamak için 'UI',' DoWork' ve 'WorkCompleted' çıktı penceresine' System.Threading.Thread.CurrentThread.ManagedThreadId' yazabilirsiniz İkinci bölüm, ancak bir Bgw (veya başka bir nesne) 'bir iş parçacığı' değil. –

+1

Üzgünüm, onu oluşturan iplik daha iyi bir ifade olurdu – Homde

+0

Bu gerçekten ilginç bir noktaya getiriyor .. Eğer bir GUI tasarımcısı bir GUI tasarımcısı bir BackgroundWorker bildirmek için bir windows form uygulamasında kullanırsanız, gerçek BackgroundWorker nesnesinde biter UI iş parçacığı veya yığın için yığın? –

5

doSomethingElse ana UI iş parçacığı

Evet, bu BackgroundWorker için olmanın ana nedeni olduğu çalıştırmak olacak olduğunu. 3 olay var, sadece DoWork ayrı bir (ThreadPool) iş parçacığı üzerinde yürütülecek. Tamamlandı ve ProgressChanged 'ana' iş parçacığına göre sıralanır.

4

BackgroundWorker, kullanıcı arabiriminden oluşturulduysa, bu durumda, RunWorkerCompleted olayı, UI iş parçacığı üzerinde de yükseltilir.

Bir arka plan iş parçacığından oluşturulmuşsa, olay tanımlanmamış bir arka plan iş parçacığında yükseltilir.

Daha fazla bilgi için bu gönderiye ve bağlantıya bakın.

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

Gerçekten! Uygulamam iyi çalıştığında ilk kez kafam karışmıştı ve Tamamlanmış olay ana kullanıcı arayüzü iş parçasından çağrıldı. Ancak, birim testlerim, tamamlanan etkinlik ana test dizisinden değil, arka plan iş parçasından çalıştırıldığı sürece başarısız oldu. –

İlgili konular