Uygulamalarımızda kullanabileceğimiz pek çok veri kaynağı tipi bulunmaktadır. Bunlardan birisi de koleksiyonlardır. Koleksiyonların kullanışlılığı, özellikle WPF'in güçlü data binding yapısı ile birlikte kullanılınca maksimum düzeye çıkmaktadır. Fakat bazı durumlarda koleksiyonlarla ilgili sıkıntılar yaşamıyor değiliz. Örnek vermek gerekirse uzun süren veri çekme işlemleri ya da bir web servisi aracılığıyla büyük verilerin çekilmesi uygulamamızı oldukça yorar ve bu yüzden veri çekme işlemleri bitene kadar kilitlenmeler yaşarız. Bunun nedeni tüm işlemlerin UI Thread içerisinde gerçekleşmesinden kaynaklanmaktadır. Çözüm yolu olarak farklı bir Thread oluşturup veri çekme işlemlerini orada gerçekleştirip dönen değerleri parametrik olarak diğer Thread’den alabiliriz.
Thread kavramını da açıklamak, çalıştırılabilir iş parçacığı anlamına gelmektedir. Çok çekirdekli sistemlerde eş zamanlı olarak farklı görevler üstlenebilmektedirler. Her ne kadar WPF'de Threading yapısı biraz değişse de amaç yine aynıdır. Farklı işlemleri birbirinden bağımsız olarak paralel bir şekilde çalıştırmaktır.
Farklı bir Thread’den aldığımız verileri UI Thread’deki koleksiyonumuza atamak istediğimizde ise, farklı Thread’lerden UI Thread’deki koleksiyonumuza erişemeyeceğimizi belirten bir hata almamız kaçınılmazdır. WPF takımının da dikkatini çekmiş olacak ki bu sorun, tam da aradığımız çözümü WPF 4.5 ile beraber bizlere sunmuşlar. Farklı thread’lerden UI Thread’deki bir koleksiyona erişebilmek için BindingOperations sınıfının EnableCollectionSynchronization isimli statik metodunu kullanmak yeterli.
public static object _lock = new object(); var nameList = new ObservableCollection<string>(); BindingOperations.EnableCollectionSynchronization(nameList, _lock);
Burada dikkat edilmesi gereken en önemli noktalardan birisi de koleksiyonumuza farklı bir Thread’den erişilmeden önce bu metodun çağrılmış olmasını garantiye almalıyız. Bu yüzden de metod çağrımını ilgili sınıfın yapıcı metodunda ya da Thread’leri başlatmadan önce yapmakta fayda var. Koleksiyonumuz için yukarıdaki gibi bir tanımlama yaptıktan sonra artık herhangi bir Thread içerisinden erişebiliriz.