BackgroundWorker, programlamaya yeni başlayan çoğu programcının hatta uzun zamandır programlama ile uğraşmış kişilerin bile gözünden kaçabilen bu ufak nesne ne işe yarar ? çalışma mantığı nedir ? gibi bazı sorulara kendimce cevap vermeye çalışıcam ilk olarak adından da anlaşılacağı gibi bu nesne arkaplanda programın çalışmasını durdurmayacak şekilde bazı işlerin yapılmasını sağlar derleyiciler programı satır satır işlediklerinden bir işlem bitmeden diğerine geçiş yapılmaz buda işlem gerçekleşirken kullanıcının boş bir ekran görmesi veya işlem yapamadan beklemesi anlamına gelir ki buda bir çok kullanıcıyı sıkar. Örneğin internet üzerindeki bir serverdan tek tek verileri çekip ardından başka bir servera kayıt işlemi yapıyorsunuz.Bu işlem binlerce kayıt arasında saniyeler hatta dakikalarca bekletme yapar bu sırada kullanıcının bu işlemi iptal etme veya başla bir işlemden devam edebilme özgürlüğü sağlıyacak olan aracımız ise ” backgroundworker ” herneyse iyice uzatmayayım konuyu gelelim örnek kodlara …backgroundWorker1.RunWorkerAsync();// Yukarıdaki Kodu yazarak backgroundworker nesnemizi çalıştırıyoruz..private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){//Bu alana arka planda uygulamadan bağımsız çalışmasını istediğimiz kodları yazıyoruz…}private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){// Bu alanda işlemin devamlılığı ile ilgili verileri progressbara gönderiyoruz örneğin serverdan gelen vernin nekadarının tamamlandığı..}private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){//Bu alanda ise işlem tamamlandıktan sonra ne yapılacağı yazılacak örneğin yükleme bittikten sonra formu kapat veya kullanıcıya bir mesaj ver gibi seçenekler}
şimdi backgroundworker’in ne işe yaradığını tam olarak anlamanız için 2 küçük uygulama yapalım….öncelikle bir application açıp bir tane buton ekliyoruz..private void Form1_Load(object sender, EventArgs e){do{button1.Top += 1;System.Threading.Thread.Sleep(50);}while (true);// ve ardından formumuzun load eventine yukarıdaki döngüyü yazıyoruz..// bu döngü 50 milisaniye aralıklarla butonumuzu 1 kademe aşağı indiricek// fakat bu döngü sonsuz bir döngü bu işlem asla bitmeyecek ve kullanıcı başka bir işlem yapabilmek için döngünün bitmesini beklemek zorunda}
şimdide aynı projenin backgroundworker nesnesi ile yapılmış halini uygulayalım private void Form1_Load(object sender, EventArgs e){backgroundWorker1.RunWorkerAsync();// bu sefer form load eventinde nesneyi aktif ediyoruz..}private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){// ve ardından aynı döngüyü arkaplanda bağımsız çalışması için nesnemizin dowork eventine yazıyoruz..//şimfi farkı beraber görelim….do{button1.Top += 1;}while (true);}
iki uygulamayıda yaptıysanız aradaki farkı ve çalışma prensibini anlamış olmanız lazım son olarak ta bir progressbar örneği ile konuyu sonlandırıcam gerisi sizin programlama tekniğinize kalmış istediğiniz loading.. ekranları arkaplanda çalışan sonsuz döngüler ve daha bir çok seçenek …prograssbar örneği için application başlatalım ve formunuza 2 tane button,progressbar ve backgroundworker ekliyelim.private void Form1_Load(object sender, EventArgs e){//ProgressBarin max degerini verelim.progressBar1.Maximum = 1000;//BackgroundWorker’dan ana kanalımıza 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 saydıralım ve//50 milisaniye bekletelim. Worker’imiz sürekli iptal istegi gelip 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();}
umarım herkeze yardımcı olabilmişimdir.. herkeze iyi kodlamalar…