BackgroundWorker, arka planda eş zamanlı çalışan işlemlerin yapılması için kullanılır. C#'da yazdığımız programlar çalıştırıldığında varsayılan olarak tek bir thread üzerinden çalışır (bkz. main metodu). Böyle bir durumda, bir işlemin başlatılabilmesi için öncelikle o an çalışmakta olan işlemin tamamlanması gerekir. Örneğin bir uygulama, kendini güncellerken güncelleme backgroundworker (ayrı bir thread) kullanılarak yapılıyorsa , güncelleme işlemi esnasında kullanıcı uygulamayı kullanmaya devam eder. Aksi halde güncelleme işlemi bitene kadar kullanıcı uygulamayı kullanamaz ve uygulama kilitlenir.
Microsoft dökümanlarından faydalanarak yaptığım basit bir projenin kodlarını aşağıda paylaştım. Lütfen daha iyi öğrenebilmek için kodları yazarak çalışınız. Yeni bir proje açın, projenin adına "BackgroundWorkerSimple" yazın ve projeyi oluşturun. Formunuza 1 adet label (baslatLabel), 2 adet buton (baslatButton, durdurButton) ve 1 adet backgroundworker (backgroundWorker1) ekleyin. Formu resimdeki gibi düzenleyin. Özelliklerden(property) Butonlara click olayı(event) ve backgroundworker'a da DoWork, ProgressChanged ve RunWorkerCompleted olaylarını(event) ekleyin.
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace BackgroundWorkerSimple
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true; //backgroundWorker1 için işlemin ilerlemesini raporlama aktif edildi
backgroundWorker1.WorkerSupportsCancellation = true; //backgroundWorker1 için işlemin durdurulabilme aktif edildi
}
private void baslatButton_Click(object sender, EventArgs e) // Başlat butonuna click olayını (eventini) ekledim
{
if (backgroundWorker1.IsBusy != true)
{
/* Eğer backgroundWorker1 meşgul değilse yani işlem yapmıyorsa, butona bastığımda asenkron olacak bu işlemi başlatsın.
Asenkron işlem başlatmak yeni bir thread açmaktır yani basitçe açıklayacak olursak çalışan hiçbir farklı
işlemi beklemeden kullanıcının istediği anda işlemin başlamasıdır. */
backgroundWorker1.RunWorkerAsync();
}
}
private void durdurButton_Click(object sender, EventArgs e) // Durdur butonuna click olayını (eventini) ekledim
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
/* Eğer backgroundWorker1 için durdurulabilme özelliği de aktifse ki başta aktif ettim, butona
bastığımda backgroundWorker'in durdurulmasını istedim. Yanlış anlaşılmasın burada işlemi durdurmadım sadece
durdurulmasını istedim */
backgroundWorker1.CancelAsync();
}
}
// DoWork olayı (eventi) işlemin yapıldığı yerdir.
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
// Eğer yapılan işlemi durdumak için istek gönderildiyse, DoWork olayını durdur ve döngüden çık.
e.Cancel = true;
break;
}
else
{
// Durdurma isteği gönderilmediyse işlemi gerçekleştirmeye devam et ve rapor et.
System.Threading.Thread.Sleep(500); // İşi yapmadan önce yarım saniye beklemisini istedim. (İşlemleri adım adım görmek için)
worker.ReportProgress(i * 10);
}
}
}
// backgroundworker1 ilerleme olduğunda bunu bildirmesi için ProgressChanged olayı (eventi) kullanılır.
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
sonucLabel.Text = (e.ProgressPercentage.ToString() + "%");
}
// backgroundWorker1 işi bittiğinde, bitirildiğinde veya hata ile karşılaşması durumunda eklenen RunWorkerCompleted olayı (eventi) çalışır.
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
sonucLabel.Text = "Durduruldu!";
}
else if (e.Error != null)
{
sonucLabel.Text = "Hata: " + e.Error.Message;
}
else
{
sonucLabel.Text = "Tamamlandı!";
}
}
// Not: BackgroundWorker'ın threadden farkı kısıtlı özelliklere sahip olmasıdır. İki nesneninde yaptığı iş aynıdır.
}
}
Size yardımcı olabildiysem bir beğeninizi alırım. İyi forumlar. 🙂