C# Multi Thread Kullanımı [Örnek Anlatım]

C# Multi Thread Kullanımı [Örnek Anlatım]

C# İle WinForm uygulaması geliştirirken döngülerimiz olabilir ve bu döngüler sonlanana kadar form üzerinden işlem yapmamız maalesef söz konusu olamıyor. Tabi bu maalesef multi thread özelliği taşımayan uygulamalar için geçerli. Vermiş olduğum örnek tabi ki multi thread sadece burada kullanılır demek için değil genel olarak karşılaşılabilecek bir sorun üzerine.

Örnekte de dediğimiz gibi arka planda döngü işlem gerçekleştirirken formda farklı işlemler yapmamız gerekebilir ya da formu kapatmamız gerekebilir. Multi thread kullanılmamış bir form uygulamasında bunu yapmak mümkün değil. İşte tam da bu noktada C#'ın multi thread özelliği yardımımıza koşuyor.

Örneklendirmek gerekirse şöyle bir projemiz olsun ;

Gönderim listesi alanına satır satır telefon numaralarını gireceğiz ve bu numaralar foreach ile döngüye girip REST API üzerinden mesajımızı gönderecek. Bunu düz bir şekilde kodlarsak gönderimi başlat butonunun click event ine kodumuzu şöyle yazarız ;


private void gonderButon_Click(object sender, EventArgs e)
        {
            string[] lines = textEdit3.Lines;
            // numaraları yazacağımız textbox alanının adı textEdit3
            foreach (var line in lines)
            {
    using (var client = new WebClient())
                {
                    var values = new NameValueCollection();
                    values["phone"] = line;
                    values["message"] = memoEdit1.Text;

                    var response = client.UploadValues("http://" + textEdit1.Text + ":" + textEdit2.Text + "/v1/sms/", values);

                    var responseString = Encoding.Default.GetString(response);
                    textEdit4.Text = line + " " + responseString;
                    Application.DoEvents();
                    Thread.Sleep(2000);
                }
            }

        }

Bu şekilde bir işlem gerçekleştirdiğimizde gönderim işlemi başlatılacak ancak gönderimi iptal et butonu çalışmayacak. Döngü tamamlandığında diğer form elemanlarına erişim imkanımız olacak. Bunun önüne geçmek için multi thread kullanacağız. Şimdi multi thread ile nasıl işlem gerçekleştirebileceğimize bakalım.



 public void MesajGonder()
        {
            string[] lines = textEdit3.Lines;
            foreach (var line in lines)
            {

                using (var client = new WebClient())
                {
                    var values = new NameValueCollection();
                    values["phone"] = line;
                    values["message"] = memoEdit1.Text;

                    var response = client.UploadValues("http://" + textEdit1.Text + ":" + textEdit2.Text + "/v1/sms/", values);

                    var responseString = Encoding.Default.GetString(response);
                    textEdit4.Text = line + " " + responseString;
                    Application.DoEvents();
                    Thread.Sleep(2000);
                }
            }
            MessageBox.Show("GÖNDERİM TAMAMLANDI", "BİLDİRİM", MessageBoxButtons.OK, MessageBoxIcon.Information);
            textEdit4.Text = "GÖNDERİM TAMAMLANDI";
        }

         private void gonderButon_Click(object sender, EventArgs e)
        {

                Thread th1 = new Thread(new ThreadStart(MesajGonder));
                th1.Start();

        }

Önce MesajGonder adında bir public sınıfı oluşturduk ve bunun içine gönderim işlemi yapacağımız kodları ekledik. Ardından gönderimi başlat butonumuzun click eventine bu sınıfı Thread olarak tanımladık ve belirttiğimiz Thread ismini Start(); fonksiyonu ile başlattık.

Thread işlemlerinde projemize System.Thread kütüphanesini dahil etmemiz gerekli bunun için ;

using System.Threading;

Projemizin üst alanına eklememiz gereklidir.

Not :

Thread çakışması algılandı v.b hata almanız durumunda formunuzun load event kısmına çakışmaları göz ardı etmesi için aşağıdaki kodu eklemeniz gereklidir.

Control.CheckForIllegalCrossThreadCalls = false;