23 Temmuz 2013 Salı

Threading - Giriş



                 Threadler, Programda paralel ve birbirinden bağımsız işlemler yapmamıza olanak sağlar. Programımıza bazen masraflı(iş yükü büyük olan,uzun süren) işlemler yaptırmak zorunda kalabiliriz toplu mail gönderme , export(excel olur,pdf olur :) , uzun hesaplama gerektiren metodlar vb. İşte bu gibi durumlarda programımızın uzun süren işlemleri gerçekleştirirken beklenilmesi kullanıcının zamanına mal olur ve bu da canını sıkar .
                Yine basit bir örnekle konuya girelim,
                Visual Studiomuzda bir form application açalım ve formumuza iki adet button ekleyelim birisinin adı mailgonder diğerinin adı baskabirisyap olsun :) , MailGonder ve BaskaIsYap metodlarını ekleyelim , Her iki buttonumuzun click eventlerinde  metodlarımızı kullanalım ;

        private void mailGonder_Click(object sender, EventArgs e)
        {
            MailGonder();
        }

        private void baskaIs_Click(object sender, EventArgs e)
        {
            BaskaIsYap();
        }

        private void MailGonder()
        {
            MessageBox.Show("Mail Gönderme İşlemi Başladı...");
            Thread.Sleep(5000);
            MessageBox.Show("Mail Gönderme İşlemi Bitti...");
        }

        private void BaskaIsYap()
        {
            MessageBox.Show("Başka Bir İşlem Başladı");
            Thread.Sleep(5000);
            MessageBox.Show("Başka Bir İşlem Bitti");
        }


Mail Gonder Butonuna tıkladığınız anda bir messageboxta işlemin başladığını belirten bir yazı çıkacak ardından Thread.Sleep(5000); programımızı 5 saniyeliğine uyutuyoruz (konumuz threading olduğu için başka konulara dallanmak istemedim mail gönderme işlemimizin 5 saniyede gerçekleştiğini varsayalım.)sonrada işlemin bittiğine dair bir ifade messageboxla ekrana gelmesini sağlıyoruz. BaskaIsYap metodunda da aynı işlemler mevcut.
       Şimdi programı çalıştırıp mail gönder butonuna basıyoruz “Mail gönderme işi başladı” yazan kutucuk çıktıktan sonra hemen başka bir iş yap butonuna, ilk butona basmanızdan 5 saniye gecmeden basılamadığını göreceksiniz yani mail gönderim işlemi tamamlanana kadar programınızda başka bir işlem yapmanıza olanak yok tabi threadingle henüz tanışmadıysanız :)
       Uygulamamızda thread’i 2 farklı şekilde kullanabiliriz birincisi methodu bir delegeye atarız ve delegeyi beginInvoke() methoduyla uyandırırız, bu method bize Iasync tipinde bir nesne döndürür ve biz bu nesnenin methodlarıyla thread hakkında bilgiler alıp işlemler yapabiliriz diğer yöntem ise Thread classı kullanarak bir nesne oluşturmak ,bu nesneye ayrı threadde çalışmasını istediğimiz methodu vermek ve threadi başlatmak. Ben örneğime ikinci yöntemle devam edicem ;
      

      // private Thread thread1;
         private void mailGonder_Click(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(MailGonder);
            thread1.Start();
        }

       // private Thread thread2;
         private void baskaIs_Click(object sender, EventArgs e)
        {
            Thread thread2 = new Thread(BaskaIsYap);
            thread2.Start();
        }

         private void MailGonder()
        {
            MessageBox.Show("Mail Gönderme İşi Başladı...");
            Thread.Sleep(5000);
            MessageBox.Show("Mail Gönderme İşi Bitti...");
        }

         private void BaskaIsYap()
        {
            MessageBox.Show("Başka Bir İş Başladı");
            Thread.Sleep(5000);
            MessageBox.Show("Başka Bir İş Bitti");
        }  
      
Önce thread sınıfından thread1 nesnesini oluşturdum , oluşturma esnasında çalışan constructor methodunda ayrı threadde çalıştırmak istediğim methodu verdim. Ve son olarak nesnenin start() methoduyla mail gönderme işlemlerimi programın işleyiş sürecinden ayırarak paralel bir süreçte gerçekleşmesin sağladım .


       Yazılarımı Kısa tutma taraftarıyım o sebepten bu yazı thread’e giriş niteliğinde  temel bilgilerden oluştu, ileride  threadpool sınıfından, Senkronizasyon sıkıntılarından ,Race Conditiondan, locktan, deadloctan ve hatta interlocktan :), monitorden, mutexden, semaphore dan bahsedeceğim yazılarda görüşmek üzere ...       

Hiç yorum yok:

Yorum Gönder