2011-01-21 17 views

cevap

7

BackgroundWorker bir akım SynchronizationContext çalışması için ayarlanmış olan dayanır. Özellikle UI kodu ile çalışmak için tasarlanmış ve tasarlanmış. Hiçbir UI senkronizasyon sorunları vardır çünkü

Bu bir hizmet tipik iyidir, senin konuları kendine yönetmek. İş parçacığı API'sini (veya .NET 4 Görev API'sini) kullanarak burada daha iyi bir seçenek.

+0

Teşekkürler, Reed. Sadece UI kodu için kullanıldığını ve bunu hiçbir zaman bir hizmette kullanmam gerektiğini okudum, fakat ofiste "kriz" denen bazı kişilerle "yıllardır çalışıyoruz" iddiasıyla bir takım krizler yaşıyoruz. şey. Onlara konuyla ilgili bağımsız bir görüş vermek istedim. –

+1

Otavio'nın “kriz” - ve bizim edisyonumuzu - özellikle neden * iş parçacığı/Görev API'si> BackgroundWorker'ı bir hizmette çözme yeteneğini geliştirmek adına, özellikle? C. Lawrence hastalığa neden olan bir etki bildirmemiştir: Hangi hastalık etkileri olabilir? –

+1

@djacobson: Söz konusu hizmete bağlı. Senkronizasyon bağlamı mevcut değilse, BW yalnızca ek bir ek yük ekleyebilir ve fayda sağlamaz. WCF gibi bir SC ile bir hizmette kullanıyorsanız, beklendiği gibi çalışır, ancak gerçekten hala gereksizdir.Sadece DoWork yöntemini çağırmak ve ihtiyaç duyulduğunda diğer yöntemleri çağırmak için daha kolay ... –

1

Windows Hizmetleri'nde BackgroundWorker'ı hiç bir etki göstermeden defalarca kullandım. SynchronizationContext'in kullanımı gereksiz olsa da, sorunlara veya düşük performansa neden olduğunu gözlemlemiştim.

2

Evet, bu bir hizmetindeki bir BGW kullanmak okayish var, sadece özellikle yararlı bir şey yapmaz. Olmanın nedeni, ProgressChanged ve RunWorkerCompleted olaylarını belirli bir iş parçacığı üzerinde yükseltme yeteneğidir. Bir özel iş parçacığı üzerinde çalıştırmak için kod almak çok önemsiz bir şeydir. Kod yürütülürken sadece iş parçacığına bir çağrı enjekte edemezsiniz. Bu korkunç yeniden-entrancy problemlerine neden olur. İçe aktarma kodunun sorun yaratmayacağı bir durumda, iş parçacığının 'boş' olması gerekir. boşta çalışma durumunda bir iplik olması

oldukça doğal olmayan bir durumdur. no'lu kodlu ipleri kullanarak, topuzlarını boşa harcamamalarını sağlayın. Ancak, bir UI iş parçacığının çalışma şekli budur. Saatinin% 99'unu mesaj döngüsünde harcayarak, Windows'un bir şey yapmasını söylemesi bekleniyor. Bir düğme tıklaması, bir boya talebi, bir klavye baskısı, bu tür şeyler. Mesaj döngüsünün içinde olsa da, aslında boşta. Enjekte edilen kodu yürütmek için çok iyi bir zaman. Win Control.Begin/çağır ve WPF'ın Dispatcher.Begin/Invoke ne olduğunu

. Bir sıraya delege koydular, sıra boşaldı ve ileti döngüsü tarafından yürütülen temsilci hedefleri. WindowsFormsSynchronizationContext ve DispatcherSynchronizationContext sınıfları, bunları kullanan eşitleme sağlayıcılarıdır. Winforms ve WPF, SynchronizationContext.Current ile bunların bir örneğini değiştirir. Sırayla olayları yükseltmek için BGW tarafından kullanılır. Bu, kullanıcı arabiriminde çalışmasını sağlar. Hangi iş parçacığı olmayan kullanıcı arabirimi bileşenlerini çalışan iş parçacığından güncelleştirmenize izin verir.

Büyük olasılıkla bunun nereye gittiğini görebiliyorsunuz, bir hizmet de kullanmıyor. Varsayılan senkronizasyon sağlayıcısı hiçbir şeyi senkronize etmez. Sadece Gönder veya Gönder geri aramayı çağırmak için bir threadpool iş parçacığı kullanır. BGW'yi bir hizmette kullandığınızda ne olur. Şimdi bu olayları gerçekleştirmenin hiçbir anlamı yok. DoWork işleyicisinin olay işleme yöntemlerini doğrudan aramasına izin verebilirsiniz. Sonuçta, DoWork'un çalıştığı iş parçacığı da başka bir iş parçacığı iş parçacığıdır.

Eh, biraz daha yavaş hale dışında yapılan hiçbir gerçek zarar,.