C# ile Multi Thread Kullanımı | Aynı Anda Birden Fazla İşlem Yaptırmak !
Okunma Sayısı : 3651
Yayınlanma Tarihi : Çarşamba , 16 Eylül , 2020
C# (C-Sharp) ile çalışırken formunuzdaki bir butona tıklayınca form donuyor ve işlem yapamıyor olabilirsiniz. Bunun temel sorunu temel iş parçacıklarının thread yapısı olmadan aynı anda dinlenemiyor oluşudur. Şimdi sizlerle bir örnek uygulama yaparak c# ile aynı anda birden fazla işlem yaptırmak ve multi thread yapısına uygun çok güzel bir örnek geliştirelim.
Formuma 1 adet buton ve 1 adet label ekliyorum. Amacım formuma tıklayınca label 1'den 10'a kadar saysın. Tabi bunu buton içerisinde bir for döngüsü ile sağlayalım ve timer kullanmayalım. Butona tıklayınca label'ın değişimini görebilelim.
Öncelikle form yapımız şu şekilde.
Ve buton click kodlarımız böyle. Ama bu formu çalıştırıp butona tıkladığımızda formun donduğunu ve 10 saniye sonra labelin 10 olduğunu göreceğiz.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i < 11; i++)
{
System.Threading.Thread.Sleep(1000);
label1.Text = i.ToString();
}
}
}
}
Şimdi kodlarımızı şu şekilde revize edelim. Öncelikle butonumuzun en click olayının tamamını bir thread içerisine alarak parçacığın multi thread yapısına uygun olmasını sağlayalım. Ardından labelin anlık değişimini görebilmemiz için label etiketini invoke action olarak belirtelim.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() =>
{
for (int i = 1; i < 11; i++)
{
System.Threading.Thread.Sleep(1000);
Invoke((Action)(() =>
{
label1.Text = i.ToString();
}));
}
});
thread.Start();
}
}
}
Evet bu revizeyi kodlarımızda uyguladıktan sonra formunuzu artık çalıştırdığınızda labelin anlık olarak değiştiğini ve formun donmadığını göreceksiniz. Bu yapıya uygun formunuzu anlık olarak kullanabilirsiniz. Invoke Action yapısı çalışırken formunuzu kapatmaya çalıştığınızda hata alabilirsiniz. Bu yüzden tüm kod bloklarınızı TRY CATCH içerisine alırsanız bu sorunu da çözmüş olursunuz.
Sevgilerimle.