BackgroundWorker

BackgroundWorker’ .NET 2.0 ile gelen güzel bir component. Adından da anlaşılabileceği BackgroundWorker  arkaplanda çalışarak Ana kanalınızı tıkamadan işlemler yürütmeye yarayan bir component. Formunuza eklediğiniz her BackgroundWorker kendi için farklı kanal oluşturur ve her kanal birbirinden bağımsız olarak çalışır.
Örneğin Formunuzda 5 tane button olduğu düşünün ve beş butonun Click eventinde de 2 dakika sürecek bir işlem olduğunu farzedelim. Eğer uygulamanızda kanallardan faydalanmıyor iseniz 1. Butona bastıktan sonra 2.ye basabilmecek için 2 dakika beklemeniz gerekir.Sebebi basit uygulamanız tek kanaldan çalışır ve o kanalda tamamen verilen iş için çalışır 2. bir işi yapamaz. Fakat siz 5 farklı kanal oluşturursanız ve her butonu farklı kanaldan çalıştırırsanız işte o zaman 5 butonada istediğiniz zaman basabilirsiniz. Doğal olarak performansınız tek kanallı çalışmaya göre daha düşük olacaktır.
BackgroundWorker kullanımına örnek bir uygulama yazalım.
Yeni bir Windows Forms Application başlatalım ve formunuza  2 tane Button,ProgressBar ve BackgroundWorker sürükleyin.
backgroundworker-ile-kanal-uygulamasi-1

backgroundworker-ile-kanal-uygulamasi-1

BackgroundWorker’a ait 3 event mevcuttur ve bu 3’eventin kullanımı aşağıda verilmiştir.
private void Form1_Load(object sender, EventArgs e)
        {
            //ProgressBarın max değerini verelim.
            progressBar1.Maximum = 1000;
            //BackgroundWorker’dan ana kanalımıza progress bilgisi döndürebilmek için.
            backgroundWorker1.WorkerReportsProgress = true;
            //Worker’ı iptal edebilmek için.
            backgroundWorker1.WorkerSupportsCancellation = true;
        }
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //Basit bir Döngü içerisinden 1000 e kadar saydıralım ve
            //50 milisaniye bekletelim. Worker’ımız sürekli iptal isteği geliğ gelmediğini
            //kontrol ediyor. Eğer istek gelirse işlem İptal ediliyor.
            for (int i = 0;i< 1000; i++)
            {
                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    MessageBox.Show(“İşlem İptal Edildi”);
                    break;
                }
                System.Threading.Thread.Sleep(50);
                //ReportProgress methodu ise ProgressChanged eventine paramatre geçirerek
                //ProgressBar’ın value’su için kullanacağımız veriyi sağlıyor.
                backgroundWorker1.ReportProgress(i);
            }
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //Kanal içerisinden her değer gönderildiğinde ProgressBar’da gösterelim.
            progressBar1.Value = e.ProgressPercentage;
        }
        private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(“İşlem Bitti”);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }