BackgroundWorker'ın Windows Services'te kullanılmamasını bildiğimi biliyorum, ancak nedenini açıklayan iyi bir çevrimiçi başvuruya sahip olur mu?BackgroundWorker bileşeni hizmetlerde
cevap
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.
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.
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,.
- 1. BackgroundWorker için zaman aşımı
- 2. BackgroundWorker RunWorkerCompleted Event
- 3. BackgroundWorker nesnesini nasıl döndürür
- 4. BackgroundWorker nasıl kullanılır?
- 5. Thread.Start() vs BackgroundWorker
- 6. C# backgroundworker döngü
- 7. Bileşeni
- 8. BackgroundWorker ve System.Threadding.Thread arasındaki fark
- 9. WPF/BackgroundWorker ve BitmapSource problemi
- 10. Bu BackgroundWorker şu anda meşgul ve ben iki kez backgroundworker başlar bir düğmeyi tıklarsanız aynı anda
- 11. bileşeni ThemedDBGrid
- 12. OptionsResolver bileşeni
- 13. Angular2 bileşeni
- 14. BackgroundWorker iş parçacığı WinForms UI güncelleştirmesi
- 15. Silverlight MessageBox.SWCF hizmet çağrısını engelleyen BackgroundWorker
- 16. WPF'de BackgroundWorker ile Kullanıcı Arabirimini Güncelleme
- 17. BackgroundWorker uzun süreli çalışma için uygun mu?
- 18. BackgroundWorker - Çapraz iş parçacığı geçerli değil
- 19. BackgroundWorker raporu harici sınıftan mı geliyor?
- 20. .net 2.0 IRC bileşeni
- 21. hayır "başlık" bileşeni tanımlandı
- 22. Code128/EAN128 barkod bileşeni?
- 23. Bileşeni modelde kullanma
- 24. başlatma bileşeni bazı rastladım
- 25. ComponentRefs Bileşeni Oluşturma
- 26. Solr kümeleme bileşeni nedir?
- 27. Bir Yazılım Bileşeni
- 28. bileşeni ithalat tanınmayan tepki
- 29. JSF özel bileşeni bulunamadı
- 30. Bileşeni kendisi yok - angular2
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. –
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? –
@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 ... –