GUI çatısılarının tamamı tek thread'le çalışırlar. Dolayısıyla arka planda çalışan bir thread'den GUI'yi güncellemek her zaman dikkatli olmayı gerektirir. Aşağıda konuyla ilgili bazı notlarım var.
.Net
WPF
Aşağıdaki örnekler WPF ile ilgili
CheckForIllegalCrossThreadCalls alanı
Bu alana false değeri atanırsa, bir baaşka thread'den GUI'ye erişildi uyarısı alınmaz.
.Net
WPF
Aşağıdaki örnekler WPF ile ilgili
QueueUserWorkItem metodundan UI thread'e mesaj yollamak
UI Thread'e mesaj yollamak için Dispatcher.Invoke() veya Dispatcher.BeginInvoke() metodlarından birisi kullanılabilir.
Burada sorusunda da açıklandığı gibi System.Windows.Threading.Dispatcher.BeginInvoke(Delegate)
metodu worker thread içinde çağırılınca UI thread'e bir mesaj yollar.
Mesaj UI thread içinde çalıştırılır. Worker thread ise BeginInvoke
metodundan sonraki kodu çalıştırmaya devam eder.
Bir başka örnek:
WPF'i Başka Bir Thread İçinde Çalıştırmak
Burada birden fazla WPF Dispatcher threadini başlatma yolu gösteriliyor. Open window inside a thread başlıklı yazı da okumaya değer.
WinForms
Winforms bileşenlerini sadece belli metodları başka bir thread içinde çağırılabilir. Bunlar Invoke(), BeginInvoke(),EndInvoke() ve CreateGraphics() metodlarıdır.
BackgroundWorker
BackgroundWorker yazısına taşıdım.
Thread Sınıfından GUI'ye Mesaj Yollamak
Control sınıfının Invoke metodu kullanılır. Örnek:public class MyFormControl : FormControl sınıfı Örnekleri
{
public delegate void AddListItem();
public MyFormControl()
{
myDelegate = new AddListItem(AddListItemMethod);
}
public void AddListItemMethod()
{
}
}
public class MyThreadClass
{
public void Run()
{
myFormControl1.Invoke(myFormControl1.myDelegate);
}
}
CheckForIllegalCrossThreadCalls alanı
Bu alana false değeri atanırsa, bir baaşka thread'den GUI'ye erişildi uyarısı alınmaz.
Hiç yorum yok:
Yorum Gönder