2009-08-16 16 views
14

Bunun için MSDN'den örnekler kullanmayı denedim, ancak yalnızca Windows Forms için geçerli görünüyorlar. Örneğin .InvokeRequired kullanma yöntemi, windows form denetimi üzerinde dayanır, ancak bu yöntem WPF denetimleri için kullanılabilir değildir. Backgound işçi yöntemi de bir InvalidOperationException atar - Farklı iş parçacığı sahibi çünkü çağıran iş parçacığı bu nesneye erişemiyorGüvenli bir şekilde C# WPF kontrolüne nasıl erişilir?

.

Peki bu, WPF bağlamında nasıl yapılabilir?

cevap

33

Yalnızca ana WPF UI iş parçacığına yapılan çağrıyı hızlandıracak olan Dispatcher.Invoke yöntemini (veya eşzamanlı olmayan eşdeğer Dispatcher.BeginInvoke) kullanmak istiyorsunuz.

DependencyObject sınıf WinForms benzer bir şekilde, aynı zamanda bu özelliğe sahip bu sınıftan devralan tüm kontroller ve diğer nesneleri anlamına gelir Dispatcher özelliği, ihtiva etmektedir. Ayrıca, Application nesnesi, dağıtıcıya erişim sağlar.

this.Dispatcher.Invoke((Action)(() => 
    { 
     ... 
    })); 
+0

sayesinde mükemmel çalıştı:

bir örnek kullanımı aşağıdaki (a Window/UserControl arasında kod-arkasında) olabilir. WPF'de, ne yapmanız gerektiğini bildiğinizde, WPF'de aslında çok daha basit görünüyor ;-) –

+0

Sorun yok. Ve evet WPF kesinlikle daha iyi bir iş parçacığı/mesaj pompa modeline sahip. – Noldorin

İlgili konular