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 ...










