Bilgisayarda her açılan program kendisi için bir kanal açar ve komutları bu kanal üzerinden işlemciye iletir. Siz programınızda birden fazla işlemi aynı anda kullancaksanız normal durumda bu işlemler aynı kanalı kullanacaktır. Bu işlemlerden birisi sonsuz döngüye girdiğinde kanalı işgal edeceği için diğer işlemler bu kanalı kullanamayacak ve programınız kilitlenecektir. Bu duruma örnek olarak aşaığdaki kodu gösterebiliriz.public partial class Form1 : Form{public Form1(){InitializeComponent();}int i = 0;bool Dur = false;private void Say(){while (true){if (Dur)break;i++;}Dur = false;}private void btnBasla_Click(object sender, EventArgs e){Say();}private void btnDur_Click(object sender, EventArgs e){Dur = true;}}
Burada “btnBasla” butonuna bastıktan sonra program sonuz döngüye girip programa tahsis edilen kanalı tıkayacağı için “btnDur” butonuna basamayacaksınız ve programınız kitlenecektir.Bu durumdan kurtulmak için “Say” metotu için ayrı bir kanal açmalıyız. Bu sayede “Say” metotu kendi kanalını çok yoğun kullansa bile programımızın geri kalan kısmı ayrı bir kanal kullanacağı için diğer kontrollerimizin çalışmasında bir aksaklık olmayacaktır.Bunun için Therad sınıfını kullanacağız. Bu sınıftan türettiğimiz nesnemize “Say” metotunu atayarak bu metot için ayrı bir kanal atamış olacağız.public partial class Form1 : Form{public Form1(){InitializeComponent();}int i = 0;bool Dur = false;Thread IsParcasi;private void Say(){while (true){if (Dur)break;i++;}Dur = false;}private void btnBasla_Click(object sender, EventArgs e){//Say();if (IsParcasi.ThreadState == ThreadState.Suspended) // IsParcasi askıya alınmışsaIsParcasi.Resume(); // Devam ettir.else // DeğilseIsParcasi.Start(); // Başlat}private void btnDur_Click(object sender, EventArgs e){//Dur = true;IsParcasi.Suspend();}private void Form1_Load(object sender, EventArgs e){IsParcasi = new Thread(new ThreadStart(Say));}}
Birde forma label atalım ve i değerini bu labeli yazdırmayı deneyelim. Bunun için “Say” metotunu şu şekilde değiştirelim…private void Say(){while (true){if (Dur)break;i++;label1.Text = i.ToString();}Dur = false;}
“btnBasla” butonuna basıldığında oluşan “Cross Thread” olayından dolayı programımız hata verecektir. Bu durumun sebebi iş parçacıkları arası veri aktarımıdır. Bu durumu değişik yollarla aşabiliriz ancak biz şimdilik işin kolayına kaçıp Form umuzun yapıcı metoduna aşağıdaki gibi değiştirdiğimizde programımız sorunsuz çalışacaktır.public Form1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;}
İnsanoğlunun istekleri bitmez  Birde bu artış saniyede bir olsun istersek ne yapmalıyız ? Thread sınıfının sleep metotu ile bulunduğumuz “Thread” i istediğimiz bir süre duraklataıp tekrar devam etmesini sağlayabiliriz. Metotun aldığı parametre ile Thread in kaç milisaniye bekletilceğini belirleyebiliriz. Say metotunu aşağıdaki gibi değiştirirsek bu isteğimizi gerçekleitirmiş oluruz.private void Say(){while (true){if (Dur)break;i++;label1.Text = i.ToString();Thread.Sleep(1000);}Dur = false;}
Bu kadar kod yazmışken olayı işlevsel hale getirelim ve label a sadece rakam değil salise saniye dakika saat şeklinde gösterim yapalım. Say metotunu aşağıdaki gibi değiştirdiğimizde artık kendi kronometremizi oluşturmuş olduk Hayırlı olsun…int Salise = 1;int Saniye = 0;int Dakika = 0;int Saat = 0;private void Say(){while (true){if (Dur)break;i++;Salise = i%10;if (Salise == 0){Saniye++;if (Saniye == 60){Saniye = 0;Dakika++;if (Dakika == 60){Dakika = 0;Saat++;}}}label1.Text = Saat.ToString() + “:” + Dakika.ToString() + “:” + Saniye.ToString() + “.” + Salise.ToString();Thread.Sleep(100);}Dur = false;}