MultiThread birden fazla işlemi beraber yürütme işlemine denebilir. Multithreadin önemi şurda doğar, işlemlerimiz yürürken programımız bize o işlemi hisettirmesin (programızı işleten ana iş parcacığından farklı bir iş parcacığı bu işlemi yürütsün) istiyorsak multithread işlemlere ihtiyacımız olacaktır.
WPF elemanları bir thread tarafından oluşturulur (ana threadimzi olur bu ) ve bu thread tarafından sahiplenilir. Diğer threadler bu elemanlara ulaşamaz.(Ekranda gördüğümüz elemanlar ). wpf elemanlarının “Dispatcher” propertysi ile sahibi olan Thread’e ulaşıp ona Invoke metodunu kullanarak iş yaptırabiliyoruz. ilk önce Dispatcherin kök sınıftan geldiğini söylemeliyim ki her elemanda Disparchera ulaşabileceğimizi bilelim. Hiyerarşide bunu göreibliyoruz.
Not : Abstract Classların köşeleri oval olarak eklenmiştir.
Dispatcherobjelerin Dispatcher propertsi bizi threade ulaştırabiliyor. threadler için aracı fonksiyonlar oluşturmak da gayet basit oldğuna göre. bir threade ulaşıp ona yaptırmak istediğimiz işlemi delegate ile verebilirz.
Örnek bir Thread yazıp bu Threadin bir listboxa eleman eklemesini sağlamaya çalışalım
0 1 2 3 4 5 6 | private void ListBoxDoldur(){ for (int i = 0; i < 500; i++) { listBox1.Items.Add(String.Format("{0} Nolu Elaman", i)); Thread.Sleep(100); } } |
bu metodu çağırırsak işlem bitene kadar programımız bize yanıt vermeyecektir. şimdi bu metodu yeni bir thread ile çağıralım.
0 | new Thread(ListBoxDoldur).Start(); |
bu işlem eleman eklerken bize şoyle bir hata verdirecektir.
“Başka bir iş parçacığına ait olduğundan çağıran iş parçacığı bu nesneye erişemiyor.”
Eleman eklemeye çalışan iş parcacığı ListBox’un sahini olmadığından bu işlemi gerçekleştiremeyecektir.
delegate Orneği ;
0 1 2 3 4 5 6 7 8 9 10 | private void ListBoxDoldur(){ for (int i = 0; i < 500; i++) { listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate() { listBox1.Items.Add(currentUser.Name); }); Thread.Sleep(100); } } |
listBox1 elemanının threadini alıp ona isimsiz bir fonksiyon gonderdik ve o işi yapmasını soyledik. şimdi hatasız bir şeilde 500 elemanı programımızı dondurmadan ekleyebildik.
bir sonraki örneğimiz multithread bir chat server olacaktır. iyi çalışmalar.









