C# – Çapraz İş Parçacığı İşlemi Geçerli Değil Hatası ve Çözümü

C# ile projelerinizi kodlarken aşağıdaki gibi bir hatayla karşılaşırsanız eğer çözüm için bu makaleyi okumaya devam ediniz.

Öncelikle hatamızı neymiş görelim.
Sözel olarak,
An exception of type ‘System.InvalidOperationException’ occurred in System.Windows.Forms.dll but was not handled in user code

Additional information: Çapraz iş parçacığı işlemi geçerli değil: ‘lblAdetSayisi’ denetimine oluşturulduğu iş parçacığı dışında başka bir iş parçacığından erişildi.

Resim olarak,
InvalidOperationException

Bu hatanın sebebi nedir?
Bu hatanın temel sebebi Thread çakışmaları olmasındandır.Genellikle ASenkron(MultiThread) yapısında olan programların geliştirme süreçlerinde alınan hatadır.

Bu hatanın çözümü oldukça basittir.Programınızın yüklenme aşamasına aşağıdaki kodu eklemeniz bu sorunu halledecektir.

Control.CheckForIllegalCrossThreadCalls = false;

Bu kod sayesinde Thread çakışmaları önemsenmeyecek ve somut hatalar ortadan kalkacaktır.

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

17 Cevaplar

  1. Soner KÖYLÜ dedi ki:

    Kolay gelsin Gencay bey. Yalnız neden bu şekilde yaptığımızı ve faydasını açıklayabilir misiniz? Neden bir action kullanıp bunu bir üst kontrolde Invoke etmedik te bu şekilde yaptık? Sizce bu doğru bir yaklaşım mı?

    • Gençay dedi ki:

      Merhaba Soner Bey,
      Burada yapılanın ne nedeni nede fayda veyahut zararı olur.
      Bu bir işlev yapan komuttur.Algoritma uygulamadığımız için yaklaşımı sorgulamak ne kadar lüzumlu bir uğraştır?
      İsterseniz dediğiniz gibi yollar deneyebilirsiniz.

  2. Ekrem dedi ki:

    Teşekkürler Gençay, işimi gördü (:

  3. verniy dedi ki:

    Teşekkür ederim.Bilginiz sayesinde sorun çözüldü.

  4. Tuncay dedi ki:

    Çok sağolasın InitializeComponent(); altına bu kodu eklediğimde prıl pırıl çalışmaya başladı program. Aslında ben bunu ekledim diye hiç kontrol etmedim 🙂 hataya çözmeye int daldığımda sayende hallettim sağol

  5. VB dedi ki:

    Merheba Gencay bey. Bazı insanlar bu yöntemi hiç önermiyor bilgisayara zarar verebilir. Sizce ne kdar doğru?

    • Gençay dedi ki:

      Merhaba VB;

      Bu yöntem aslen, yasal olmayan thread çağrılarının kontrol edilmemesini sağlayan bir propertyden ibarettir. Yani birnevi oluşan hataları gözardı etmekte diyebiliriz.

      Aşağıdaki kod bloğunu incelerseniz eğer içeriğimizle alakalı hata alınacaktır.

              private async void Form1_Load(object sender, EventArgs e)
              {
                  await X();
              }
      
              Task X()
              {
                  return Task.Run(() =>
                  {
                      int Sayac = 0;
                      while (true)
                          label1.Text = Sayac++.ToString();
                  });
              }
      

      Bu hatayı çözmek için kâh burada tarif edildiği gibi hatalar görmezden gelinebilir kâh aşağıdaki Invoke metoduyla hatalara mahal vermeksizin kontrollü bir şekilde işlev yerine getirilir.

              Task X()
              {
                  return Task.Run(() =>
                  {
                      int Sayac = 0;
                      while (true)
                          if (label1.InvokeRequired)//Label'a gelen talebin farklı bir iş parçacığından gelip gelmediği kontrol ediliyor.
                              label1.Invoke(new Action(delegate ()
                              {
                                  //Eğer Label'a başka bir iş parçacığından talep gelmişse Invoke metodu ile gerekli işlem gerçekleştiriliyor.
                                  label1.Text = Sayac++.ToString();
                              }));
                  });
              }
      

      Tabi ki de ikinci yöntem daha sağlıklı ve güvenilirdir. Lakin içerikte vurgulanan yöntem, basit ve etkinliği çokta geniş olmayan projeler için oldukça ideal ve pratik olduğunu bilmenizi isterim ve bu şartlarda(basit, küçük/dar kapsamlı vs. projelerde) ne bilgisayarınıza ne de projenize zarar verebileceği için kesinlikle tavsiye ederim.

      Sevgilerimle…

      • VB dedi ki:

        Tesekkur ederim Gencay bey cok iyi anlatim yaptiniz. Simdi soyle anladim ki ne projesi olursa olsun bilgisayara zarar vermez ?

        • Gençay dedi ki:

          Programlamada bilgisayara zarar verebileceğiniz en makul noktalardan biri Pointerlardır. Bu alanda bile bilinmeyen bellek adreslerine müdahale ettiğimiz vakit otomatik işletim sisteminin güvenliği tarafından engellenmekteyiz. Bunuda aşabilmeniz için oldukça zahmet göstermeniz gerekmektedir. Eee haliyle “küçük” çaplı projelerde zarar vermeyeceğinizin garantisini verebilirim. Nihayetinde var olan bazı hataları görmezden gelmekte nihai olmasada anlık olarak çözümdür ve bu çözüm küçük çaplı projelerde yeterli olacaktır.

          Sevgiler…

      • cem dedi ki:

        Teşekkürler benim de işime yaradı bu yöntem

  6. samet dedi ki:

    Saol işime yaradı.

  7. cem dedi ki:

    Teşekkürler

  8. oguz dedi ki:

    Allah razı olsun

  1. 02 Temmuz 2016

    […] alabilmek yani farklı iş parçacıklarını birbirleri denetiminde harmanlamak için öncelikle Control.CheckForIllegalCrossThreadCalls = false komutunu devreye sokmanız […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.