2011-01-06 20 views
8

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

0

İ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!

14

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.

+0

* 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

+0

@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! –

+0

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

0

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.

İlgili konular