Eğer C# ile Multi-Threading bir uygulama yapıyorsanız karşınıza çıkması muhtemel bir hatadır.

Bir form oluÅŸturursanız o form ve elemanları main thread tarafından oluÅŸturulur ve farklı bir thread’den form elemanlarına ulaÅŸamazsınız.

Örnekleyecek olursak; client-server(istemci-sunucu) haberleÅŸmsine dayanan bir program yazıyorsunuz. Server’dan bir haber gelince ona göre client formunda birÅŸeyleri deÄŸiÅŸtirmek istediniz.

Mesela  “label1.visible= true

İşte tam bu noktada şöyle bir exception ile karşılaşacaksınız:

Cross-thread operation not valid: Control ‘ClientForm’ accessed from a thread other than the thread it was created on.

Peki bunu nasıl çözeriz?

Bu sorunu aÅŸmak için C#’ın delegate yapısını kullanacağız.

  1. delegate void setVisibilityDelegate( bool vis);
  2. public void setVisibility( bool vis)
  3. {
  4. if (label1.InvokeRequired)
  5. {
  6. setVisibilityDelegate del = new setVisibilityDelegate(setVisibility);
  7. label1.Invoke(del, new object[] { vis });
  8. }
  9. else
  10. {
  11. label1.Visible = vis;
  12. }
  13. }

Bu kod parçacığı label1 isimli form kontrolümüzün görünürlülüğünü farklı thread üzerinden değiştirmemizi sağlıyor.

Ancak eÄŸer ki ” kardeÅŸim iyi de ben birçok ÅŸeyi deÄŸiÅŸtireceÄŸim, her biri için ayrı ayrı bundan yazmam mı gerekir” derseniz, sizin için de şöyle bir çözümümüz mevcut.

  1. delegate void setVisibilityDelegate(Control cont, bool vis);
  2. public void setVisibility(Control cont, bool vis)
  3. {
  4. if (cont.InvokeRequired)
  5. {
  6. setVisibilityDelegate del = new setVisibilityDelegate (setVisibility);
  7. cont.Invoke(del, new object[] {cont, vis });
  8. }
  9. else
  10. {
  11. cont.Visible = vis;
  12. }
  13. }

Burada da delegeta yapımıza ve fonksiyonumuza üzerinde değişiklik yapmak istediğimiz Control yapısını da verdik. Böylece form üzerindeki istediğimiz yapının visibility ayarını farklı bir thread üzerinden değiştirebiliriz.

Tabi bu sadece visibility ile sınırlı deÄŸil, ister text’ini deÄŸiÅŸtirin ister farklı bir özelliÄŸini, o zaman yapmanız gereken bool olarak le aldığımız argümanı deÄŸiÅŸtireceksiniz bir de

cont.Visible = vis;

yazan kısmı, ne yapmak istiyorsanız onunla değiştireceksiniz.

Hadi bakalım bu kadar gevezelik yeter, biraz da çalışalım…