Dağıtımcı açısından biraz kafam karıştı. Bir tür uzun operasyonda bir arka plan iş parçacığı olduğumu varsayalım. Anladığım kadarıyla ui iş parçacığını güncellemek istiyorum. Benim sorum, ben dağıtıcı gibi statik olarak çağrı mıyım: Dispatcher.BeginInvoke (mywork) ... Ya da kontrol etmek istiyorum güncelleme: mytextbox.Dispatcher.BeginInvoke (mywork)WPF/threading: Dispatcher vs Dispatcher bir kontrolde mi?
cevap
İlk olarak anlamak önemlidir Dispatcher
büyük arkaplan işlemlerini işlemek için tasarlanmamıştır. Bir nesnenin UI iş parçacığı üzerinde çalışmak sıraya göre tasarlanmıştır.
Dispatcher.BeginInvoke
yöntemi uygulanması standart yolu kumanda üzerindeki aramak olacağını söyleyen
: Burada NET parçacığı modeli ve Dispatcher
hakkında değerli MSDN makale
startStopButton.Dispatcher.BeginInvoke(
DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber)
);
Bu yardımcı olur umarım!
O Dispatcher.BeginInvoke
çağırarak statik çağrı olmadığını belirtmek gerekir: bu örtük this.Dispatcher.BeginInvoke
bu. Bu aramayı kullanabiliyorsanız, büyük olasılıkla kodunuzu bir kontrol veya pencereden yazıyor olabilirsiniz. Bu durumda, muhtemelen güvenlidir, çünkü çoğu zaman uygulama başına bir UI iş parçacığı olacak.
Gerçek statik arama, aramak istediğiniz bir şey içinnumaralıolan Dispatcher.CurrentDispatcher.BeginInvoke
olacaktır (Hasan Khan'ın cevabı hakkındaki yorumuma bakın).
DÜZENLEME: Application.Current.Dispatcher
çağrılması değil kötü bir şey olduğunu. (Ve, açıklık için, bu statik/tekil bir örnek olarak Application
çağrılır statik bir örnek özelliği değil.) Bu özellik, uygulamanın oluşturulduğu iş parçacığı için Dispatcher döndürecektir ve genellikle iş parçacığı UI, aswell üzerinde oluşturulur - Application.Current.Dispatcher
, myWindow.Dispatcher
ile aynı Dispatcher'ı döndürür.
Dispatcher.CurrentDispatcher
(buna karşı uyardığım) statik araması, aradığınız konu için bir Dispatcher döndürür. Bir arka plan iş parçacığı olarak adlandırırsanız, özellikle bu iş parçacığı için oluşturulan yeni bir Dispatcher alırsınız.
iken kullanılarak en olguda ya DispatcherObject.Dispatcher
genellikle tek UI iş parçacığı var gibi birden UI iş parçacığı olabilir, (tüm bağımlılık nesneleri ve kontroller diğerleri arasında, DispatcherObject
devralan) ya da Application.Current.Dispatcher
yapılacak doğru şey olduğunu ve Farklı pencereler farklı dağıtım programlarını kullanabilir. Bu durumda, dağıtıcıyı kullanarak kontrolü güncelleştirmek önemlidir. Bu, Dispatcher
özelliğinde (DispatcherObject
'dan miras alınan), bu pencerede başka herhangi bir denetimde ve pencerenin kendisinde depolanır.
- 1. Dispatcher ViewModel?
- 2. WPF Dispatcher
- 3. laravel 5 Schedular vs Indatus Dispatcher
- 4. Filtre Eşleştirmesi için Dispatcher
- 5. Spring Boot'da Dispatcher Servlet
- 6. Yolculuk Dispatcher, CherryPy for Mac'te bozuk mu?
- 7. Nasıl Dispatcher ile Image.Source özelliğini ayarlamak için?
- 8. RedO'da setTimeout ve dispatcher kullanarak periyodik eylemler nasıl tetiklenir
- 9. WPF Dispatcher Geri dönüş değeri dönüş değeri her zaman sıfır
- 10. olmayan UI kod pencereleri telefonda Dispatcher almak nasıl 8
- 11. İplikten yakalanmamış ölümcül hata [default-akka.actor.default-dispatcher-5] kapatılıyor ActorSystem
- 12. Neden Freezables zaten donmuş ve Application.Resources içinde depolandığında boş bir Dispatcher (Stiller ile aynı) var?
- 13. Firebase İş Dispatcher. iş bile Triger.Now ile 20-60 sn sonra başlar. Nasıl düzeltebilirim?
- 14. SSL sertifikasını kaynak kontrolde saklama
- 15. WPF Bir kontrolde bir özel özellik ekleme
- 16. Veri bağlama görünmez kontrolde çalışır mı?
- 17. Bahar MVC mvc ile önbelleğe alma izin ver: kaynaklar benim webapp kökünde Bahar 3 MVC Dispatcher sunucu uygulamasını konfigüre ettik
- 18. WSDL vs MEX hakkında her şey mi?
- 19. .gitingore dosyasında .vs klasörü eklemem gerekir mi?
- 20. İyi kitapların veya iyi makalelerin çoğaltılmasının öğrenilmesi mi gerekiyor?
- 21. & vs * ve | VS +
- 22. Bir sayının int türünde mi (çekirdek mi, uyuşmuş, imzalı mı değil mi) nasıl belirlenir?
- 23. TextColor vs TextColorPrimary vs TextColorSecondary
- 24. Bu olay, olay işleyicisi geri aramaları için soyut bir sınıf kullanmak için Python'dur?
- 25. Akka :: memuru ben followind dosyasına koyarak oluşturulan varsayılan-dağıtıcınızın
- 26. System.Windows.Media.DrawingVisual.RenderOpen() bir süre sonra hata veriyor
- 27. WPF: Açık Belirli bir kontrolde fareyi hareket ettirin, diğer denetimlerde boyutunu ve çakışmalarını artırın
- 28. . vs :: Bir yöntemini
- 29. ID vs UniqueID vs ClientID vs UniqueClientID vs StaticClientID?
- 30. VS 2010 ClickOnce - Çevrimdışı Kurulum için URL belirtin mi?
* Neden * Application.Current.Dispatcher'ı kötü bir fikir kullanıyor? Uygulamamda şimdiye kadar hiç sorun yaşamadan kullanıyorum. Tek gereken 'Application(). Run() 'çağrıldı. – Aphex
@Aphex: Yorumta ekleyemediğimden beri bir düzenleme olarak cevap verdim - ama Application.Current.Dispatcher ile ilgili bir sorun yok (ve ben de öyle olduğunu söylemedim). Application.Current.Dispatcher' ve 'Dispatcher.CurrentDispatcher' çok farklı davranıyor! –
Application.Current.Dispatcher kullanımının güvenli olmadığı (nadir de olsa) olduğu gibi durumlar vardır, örn. WinForms (veya başka bir WPF olmayan) app WPF kontrolü (Application.Current null) veya aynı uygulama ile birden fazla UI-thread sahip (paylaşılan uygulama kaynakları ile bir sürü sorun var, ama durum hala geçerli). Bu nedenle en güvenli yol control.Dispatcher kullanmaktır – Aloraman