C# da Thread Kavramı

Merhaba arkadaşlar. Bu makalede sizlere thread’lerden bahsedeceğim. Thread, yani kelime anlamı olarak “kanal”. Peki nedir bu kanallar? Thread’ler, process’ler içinde bulunan, aynı zaman diliminde birden fazla iş yapılmasına olanak tanıyan yapılardır. Yani thread ile siz, bir chat programında yazı yazarken, müzik dinleyebilirsiniz. Burada chat programı için ayrı, müziğin çalması için ayrı bir thread arka planda çalışmaktadır.

Buraya kadar thread ile ilgili kafanızda bir şeyler oluşmuştur. Ancak kötü bir haberim var. Threadler gerçekten işlerini aynı anda yapmıyorlar. İşlemci threadlerimize belli bir zaman dilimi veriyor – burada milisaniyelik zamanları düşünelim- threadler arasında çok hızlı geçişler yapıyor ve biz bunu algılamıyoruz. Bu noktada belirtmeliyim ki threadlerin çalışması işlemciden işlemciye bile değişebilir. Birçok algoritması vardır. Örneğin hepsine aynı zaman dilimini ayırılabilir, önceliklerine göre zaman verilebilir, en kısa sürede bitene göre ya da bitimine en az süre kalana göre zamanlama ayarlanabilir. Bu bizi pek ilgilendirmiyor ama.

Thread’lerin “ready”,”blocked”,”running” ve “terminated” durumları vardır. Running moda olan thread aktiftir ve işlemciyi kullanır. Blocked moddaki thread ise beklemededir.(Örneğin bir girdi[input] bekliyordur.) Ready moddaki thread ise çalışma sırasının kendisine gelmesini bekliyordur. Terminated moddaki ise çalışmasını bitirmiştir.

Thread ile ilgili mantıksal anlatım yeterli olmuştur sanırım. Artık C# ile kullanmaya başlayalım.

Thread ile çalışmak için System.Threading isim uzayını kullanmalıyız.

Örnek bir uygulama yapmak istiyorum. Bir adet listBox ve 4 adet buton kontrolünü forma yerleştirelim. (Başlat düğmesi, Duraklat Düğmesi, Devam Et Düğmesi, İptal Et Düğmesi)

Başlat düğmesine basınca sayılar yazılsın, bunu duraklatıp devam edebilelim ya da iptal edebilelim.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ThreadDeneme0
{
   public partial class Thread1 : Form
   {
     public Thread1()
     {
       InitializeComponent();
     }

     private void Thread1_Load(object sender, EventArgs e)
     {
       Control.CheckForIllegalCrossThreadCalls = false;
     }
     Thread t = null;
     private void btnBaslat_Click(object sender, EventArgs e)
     {
       ThreadStart ts = new ThreadStart(Yazdir);
       t = new Thread(ts);
       t.Start();
     }
     public void Yazdir()
     {
       for (int i = 0; i < 10000; i++)
       {
         listBox1.Items.Add(i);
       } 
       MessageBox.Show("Bitti");
     }

     private void btnDuraklat_Click(object sender, EventArgs e)
     {
       t.Suspend();
     }

     private void btnDevamEt_Click(object sender, EventArgs e)
     {
       t.Resume();
     }

     private void btnIptal_Click(object sender, EventArgs e)
     {
       t.Abort();
     }
   }
}

 

Şimdi yukarıdaki kodları açıklayalım. Başlat tuşuna basınca önce ThreadStart örneği yarattık. ThreadStart bir delegedir, yani metot işaretçisidir. Burada da Yazdır metoduna işaret etmektedir.Bu thread Yazdır() metotu içindeki kodu çalıştıracak. Peki neden bu delegeyi kullandık? Çünkü Thread class’ı parametre olarak bu delegeyi kullanmaktadır. Daha sonra Start() metotu ile thread başlatıldı.

Diğer düğmelere basınca neler olduğu gayet açık. Duraklatmak için Suspend(), devam etmek için Resume(), iptal etmek için Abort() metotları kullanılmış.

Asıl önemli nokta Control.CheckForIllegalCrossThreadCalls=false; satırıdır. Bu satırı çıkardığınızda

 


.Net Bir Gün Dilerim.

Yorum Yaz
Arkadaşların Burada !
Arkadaşların Burada !