Merhaba bugün sizlere Visual Studio ile WinForm uygulama yaparken label kontrolü kullandığımda karşılaştığım ve çözmüş olduğum bir konuyu paylaşacağım.
Uygulamam diskteki tüm dosyaları traverse yöntemi ile gezip bir yandan havuzu doldurup bir yandan da havuzu boşaltan mantıkta çalışan bir thread yapısı ile çalışıyor. Her bulunan dosya için bir methoda dosya paramatre geçiliyor, bittiğinde ise aşağıdaki method çağrılıyor.
1 2 3 4 5 |
void finishedItem(TraversingFinishItemEventArgs e) { label1.Text = e.Message; label1.Update() ; // Foreign resources recommends that do it but not solved the problem } |
Yukarıdaki kod 1 saniyede 1000 den fazla kez çağrıldığında ilk defada sorunsuz çalıştı , fakat butona basıp tekrar çalıştırdığımda takıldı kaldı. Güncelleme kısmında sorunlar yaşamaya başladı , titremeler yada sabit kalmalar vs vs. Dış kaynak araştırması yaptığımda label.update() gibi kodlar gördüm. Tavsiye edilen yöntemleri uyguladım fakat sonuç değişmedi.
Mantıken düşündüğümde Windows kontrolünün label kontrolünü güncellemeye yetişemediği ve olay kuyruğunda bir yığılma olduğu ve güncellemeleri üstüste bindirdiği izlenimine kapıldım.
Çözümü kendim ürettim buyrun çözümümüz.. Bir task ürettim ve task bitene kadar sonraki gelen güncelleme isteklerini görmezden geldim.
İnsan gözü en fazla kaç kare görebilirdi ki zaten bir saniyede, 30 FPS ve altı ideal :)))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Task labelUpdate; private void finishedItem(TraversingFinishItemEventArgs e) { if (labelUpdate == null || (labelUpdate != null && labelUpdate.IsCompleted)) labelUpdate = Task.Run(() => { Thread.Sleep(10); // Değeri kendinize göre artırabilirsiniz // you can increase what you need label1.Text = e.Message; label1.Update(); }); } |
Yabancı kaynaklarda C# Label Text Not Updating, Label not updating olarak ismi geçen konunun çözümü yukarıdadır 🙂 Umarım faydalı olmuşumdur.
Hayırla kalın Fi Emanillah.