BackgroundWorker’ .NET 2.0 ile gelen güzel bir component. Adindan da anlasilabilecegi BackgroundWorker arkaplanda çalisarak Ana kanalinizi tikamadan islemler yürütmeye yarayan bir component. Formunuza eklediginiz her BackgroundWorker kendi için farkli kanal olusturur ve her kanal birbirinden bagimsiz olarak çalisir.
Örnegin Formunuzda 5 tane button oldugu düsünün ve bes butonun Click eventinde de 2 dakika sürecek bir islem oldugunu farzedelim. Eger uygulamanizda kanallardan faydalanmiyor iseniz 1. Butona bastiktan sonra 2.ye basabilmecek için 2 dakika beklemeniz gerekir.Sebebi basit uygulamaniz tek kanaldan çalisir ve o kanalda tamamen verilen is için çalisir 2. bir isi yapamaz. Fakat siz 5 farkli kanal olusturursaniz ve her butonu farkli kanaldan çalistirirsaniz iste o zaman 5 butonada istediginiz zaman basabilirsiniz. Dogal olarak performansiniz tek kanalli çalismaya göre daha düsük olacaktir.
BackgroundWorker kullanimina örnek bir uygulama yazalim.
Yeni bir Windows Forms Application baslatalim ve formunuza 2 tane Button,ProgressBar ve BackgroundWorker sürükleyin.
BackgroundWorker’a ait 3 event mevcuttur ve bu 3’eventin kullanimi asagida verilmistir.
private void Form1_Load(object sender, EventArgs e)
{
//ProgressBarin max degerini verelim.
progressBar1.Maximum = 1000;
//BackgroundWorker’dan ana kanalimiza progress bilgisi döndürebilmek için.
backgroundWorker1.WorkerReportsProgress = true;
//Worker’i iptal edebilmek için.
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Basit bir Döngü içerisinden 1000 e kadar saydiralim ve
//50 milisaniye bekletelim. Worker’imiz sürekli iptal istegi gelig gelmedigini
//kontrol ediyor. Eger istek gelirse islem Iptal ediliyor.
for (int i = 0;i< 1000; i++)
{
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
MessageBox.Show(“Islem Iptal Edildi”);
break;
}
System.Threading.Thread.Sleep(50);
//ReportProgress methodu ise ProgressChanged eventine paramatre geçirerek
//ProgressBar’in value’su için kullanacagimiz veriyi sagliyor.
backgroundWorker1.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Kanal içerisinden her deger gönderildiginde ProgressBar’da gösterelim.
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show(“Islem Bitti”);
}
private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
Kolay Gelsin..