BackgroundWorker ve MultiThreading

Tarih 16 Ekim 2009 Cuma, 14:03 | Etiket(ler) Visual Basic


BackgroundWorker; kısaca hazırladığınız bir Windows formunda, adından da anlaşılabileceği gibi arka planda işlem yapmak için kullanılır. Aslında işi tamamen MultiThreading ve yaptığı işi raporlamadır. Ekleyeceğiniz her BackgroundWorker birbirinden bağımsız kanallarda çalışarak, ana kanalınızı tıkamadan çalışmanıza olanak verir. Kullanımı çok kolay olmasına rağmen işlevi büyük ve önemlidir. Örnekleyecek olursak. Windows formu içerisinde uzun sürecek bir işlem (çok kayıt döndürecek bir SQL sorgusu, Web adresi çağırma vs..) kullanıyorsak Form donacak ve işlem tamamlanana kadar yanıt vermeyecektir. Tamamen istemediğimiz bir durum. Bu sırada bir progress bar, animated gif gibi görseller kullanacak olursak, bunların görevlerini yerine getirmediğini, donduklarını göreceksiniz. İşte tam bu sırada BackgroundWorker imdada yetişiyor ve bizi bu durumdan sonsuza kadar kurtarıyor. Nasıl kullanıldığına gelirsek.

1) Form üzerine bir BackgroundWorker sürükleyip bırakıyoruz.
2) BackgroundWorker'ın arka planda çalıştıracağı kodu DoWork eventine yazıyor veya çağırıyoruz.
3) BackgroundWorker'ı çalıştırmak için RunWorkerAsync() komutu ile DoWork eventini tetikliyoruz.
4) İşlem sırasında progressbar göstermek istiyorsak BackgroundWorker'ın çalışma durumunu bildiriyoruz.
5) ProgressChanged ile Formumuz üzerindeki bir kontrolü değiştiriyoruz.

4. ve 5. maddeler tamamen opsiyonel olarak kullanılır. Bir kontrol yerine animated GIF göstermeyi tercih edebilirsiniz.

Örnek Kod :
Formda bir adet button olduğunu var sayıyorum
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
backgroundWorker1.RunWorkerAsync() 'butonumuza basıyoruz ve backgroundWorker'ı çalıştırıyoruz
Sub

Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
MsgBox("işlem başladı", MsgBoxStyle.Information, "SONUÇ")
System.Threading.Thread.Sleep(3000) ' arka planda işlem yapacak kod
End Sub
  
Private Sub backgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles backgroundWorker1.RunWorkerCompleted
MsgBox("işlem bitti", MsgBoxStyle.Information, "SONUÇ") ' bittiğinde yapılacak işlem
End Sub
Bu işlemler sırasında kullanıcı işlemi iptal etmek isteyebilir. Böyle durumlarda backgroundWorker1.CancelAsync() tetikleyerek işlemi iptal edebilirsiniz.



Yorumlar

Tarih 03 Şubat 2010 Çarşamba, 15:14 | Yazan Cenk SARI

Hem programatik olarak backgroundWorker eklemeyi, hemde real time sonuçların nasıl bir kontrole aktarılacağını görmüş oluyor bu sayede insanlar. Paylaşım için çok teşekkürler.

Tarih 03 Şubat 2010 Çarşamba, 14:43 | Yazan Musa Doğramacı

Konuyla ilgili bi paylaşımım vardı faydası olur diye paylaşıyorum

F.W 3.5'ta bulunan BackgroundWorker sınıfı thread yönetimini kolaylaştırıyor. Genelde bununla ilgili örnekler verildiği zaman progress ile ilgili görüntüsünü göstermek için 1den 10a kadar döngüyü çalıştırıp örneklendiriyorlar. Gerçekte bize lazım olan reel ilerleme zamanıdır ya da reel durumdur. Bunu timer ile birlikte kullanınca reelliği yakalayabiliyoruz. Bununla ilgili çok basit kavraya bileceğimiz bir örneğimiz olacak.

Mesela Mernis Sorgusunu ele alalım. Mernis sorgusu bitenekadar lblDurum label'i(Progressbar yerine label kullandım) üzeinde noktalar ilerleyecektir. Sorgu sonuçlanınca da ilerleme duracaktır.

Gerekli Using'ler
using System;
using System.ComponentModel;
using System.Windows;
using WpfApplication1.MernisService;
//Mernis Sorgusu için webservisini eklemek gerekiyor projeye
//bendeki webservisin adı MernisService' dir.

#region Mernis
private BackgroundWorker _bgWorkerMernis;
private System.Timers.Timer _timer;
private void GetMernis()

_bgWorkerMernis = new BackgroundWorker();
_bgWorkerMernis.WorkerReportsProgress = true;
_bgWorkerMernis.WorkerSupportsCancellation = true;
_bgWorkerMernis.DoWork += _bgWorkerMernis_DoWork;
_bgWorkerMernis.RunWorkerCompleted += _bgWorkerMernis_RunWorkerCompleted;
_bgWorkerMernis.ProgressChanged += _bgWorkerMernis_ProgressChanged;
lblDurum.Content = "Mernis Sorgusu Yaplyor ";
_bgWorkerMernis.RunWorkerAsync(11111111111);
//TcKimlikNo
}
void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (_bgWorkerMernis.IsBusy)
{
_bgWorkerMernis.ReportProgress(0);
}
}
void _bgWorkerMernis_DoWork(object sender, DoWorkEventArgs e)
{
_timer = new System.Timers.Timer(10);
_timer.Enabled = true;
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Start();

MernisService.ServiceSoapClient service = new ServiceSoapClient();
e.Result = service.TCKimlikNoSorgula(0, "sifre", Convert.ToInt64(e.Argument));//argument Tc Kimlik No tutuyor
}
void _bgWorkerMernis_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lblDurum.Content += ".";
}
void _bgWorkerMernis_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_timer.Stop();
string ad = ((MernisService.TCKimlikNoKisiBilgi) e.Result).Ad;
//...diğer bilgileri ilgili alanlara set etmek gerekiyor.
}
#endregion
Yorum yazın

Capthca Karakterleri kutuya giriniz
Kodu değiştir...


Geri Dön   |   Ana Sayfaya Dön