28 Ekim 2014 Salı

Dispatcher property kullanımı


      WPF uygulamanızda threadleri kullanarak bir şeyler gerçekleştirmeye çalışırken (multithreading) "thread kaynağa erişemiyor hatası" almanız muhtemeldir. Bu hatayı Visual Studio IDE'si 'Başka bir iş parçacıcığına ait olduğundan çağıran iş parçacığı bu nesneye erişemiyor.' (ya da İngilizce olarak 'The calling thread cannot access this object because a different thread is own it.')  şeklinde mesaj kutusu olarak görüntüler. Alınan bu hatanın nedeni sizin ana thread'inizin (siz oluşturmasanız dahi bir program açıldığında o program bir iş parçacığı yani bir thread tarafından yürütülür, bu ana thread'tir. Diğer oluşturulan threadler eş zamanlı çalışma ve çalışma yükü hafiflesin diye oluşturulur.) kullanabileceği GUI nesnesine (button, listbox, textbox gibi) başka bir thread tarafından gelen erişim isteğidir. Başka bir thread bu nesnelere direkt olarak erişemez. Örnek ile gösterirsem:


Yukarıdaki örnekte ana thread'in ulaşabileceği myTextBox textbox'una, oluşturulmuş olan yeni bir thread erişerek textini değiştirmeyi amaçlamıştır. Fakat göründüğü üzre yukarıda bahsettiğim hata mesajı dönmüş. Bu hataya bir çözüm olarak nesnenin Dispatcher (sevk eden olarak çevirilebilir) property'sinin (özelliğinin) BeginInvoke metodu kullanılarak ve ilgili parametre olarak delegate bir metod oluşturarak üstesinden gelebiliriz. Bahsetmiş olduğum çözüm:


Böylece delegate bir metod yardımı ile ilgili thread'in erişimi altındaki nesneye müdahale edebiliriz.

Hiç yorum yok:

Yorum Gönder