BackgroundWorker ile Çalışmak

Etiketler no_tag, 29.06.2005

BackgroundWorker .NET Framework 2' deki Windows Forms için en pratik özelliklerden biri. Basit şekilde uzun işler yaparken kullanıcı arabiriminin (UI) kullanılamaz gelmesini engellemek için geliştiricilerin yeni threadlarda açtığı background tasklarını daha pratik hale getirmek.

Kullanımı şu şekilde;

  1. Bir BackgroundWorker oluşturun
    Componentlardan sürükle bırak yada direk koddan
  2. DoWork event' ını hazırlayın
    DoWork
    Event' ı ana kısım, yani yapılacak iş. Buraya arka planda çalışacak kodunuzu koyun, yada ilgili metodu çağırın
  3. BackgroundWorker'ı Çalıştıralım
    RunWorkerAsync() bizim için hazırladığımız BackgroundWorker' ı çalıştıracak yani DoWork ü tetikleyecek
  4. ReportProgress ile UI ye bildirelim
    ReportProgress() ile arkaplandaki kodun durumunu bildirebilirsiniz bu ProgressChanged eventını tetikleyecek
  5. ProgressChanged ile UI' ye elleyelim
    ProgressChanged eventında ana thread olan UI üzerinde istediğimiz değişikliği yapabiliriz

Niye bu kadar kastık direk arkadaki thread' dan öndeki thread mesaj gönderelim diyebilirsiniz ancak maalesef bu threadlar exception neden oluyor. Framework 1' de bunu kazasız belasız yapabiliyorduk her ne kadar hoş bir pratik olmasa da çünkü bu şekilde Windows Message Queue' sini ihlal ediyoruz, Ancak BackgroundWorker ile doğru yolda işi halletmiş oluyoruz. Framework 1' için yazılmış ve konuyu daha geniş ele alan Safe, Simple Multithreading in Windows Forms serisini tavsiye ederim.

Örnek Projeyi Download Edin;
Örneği mümkün olan en basit şekilde tutmaya çalıştım, basit olarak BackgroundWorker' ı implemente etmeyi, arkada çalışan threadi iptal etmeyi ve UI ile ilişki kurmayı gösteriyor. Kod sadece 60 satır civarında, VS 2005 gereklidir.

BgTester.zip (56 Kb.)

Daha derin bilgi ve gelişmiş bir örnek için Advanced Basics : Doing Async the Easy Way

musado - 03.02.2010

Konuyla ilgili bi paylasimim vardi faydasi olur diye paylasiyorum

F.W 3.5'ta bulunan BackgroundWorker sinifi thread yönetimini kolaylastiriyor. Genelde bununla ilgili örnekler verildigi zaman progress ile ilgili görüntüsünü göstermek için 1den 10a kadar döngüyü çalistirip örneklendiriyorlar. Gerçekte bize lazim olan reel ilerleme zamanidir ya da reel durumdur. Bunu timer ile birlikte kullaninca reelligi yakalayabiliyoruz. Bununla ilgili çok basit kavraya bilecegimiz bir örnegimiz olacak.


Mesela Mernis Sorgusunu ele alalim. Mernis sorgusu bitenekadar
lblDurum label'i(Progressbar yerine label kullandim) üzeinde noktalar ilerleyecektir.

Sorgu sonuçlaninca da ilerleme duracaktir.

Gerekli Using'ler
using System;

using System.ComponentMod el;

using System.Windows;

using WpfApplication1. MernisService;

//Mernis Sorgusu için webservisini eklemek gerekiyor projeye
//bendeki webservisin adi MernisService' dir.

#region Mernis
private BackgroundWorker _bgWorkerMernis;
private System.Timers.Timer _timer;
private void GetMernis()
{
_bgWorkerMernis = new BackgroundWorker();
_bgWorkerMernis. WorkerReportsPro gress = true;
_bgWorkerMernis. WorkerSupportsCa ncellation = true;
_bgWorkerMernis. DoWork += _bgWorkerMernis_ DoWork;
_bgWorkerMernis. RunWorkerComplet ed += _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.TCKimlikNoS orgula(0, "sifre", Convert.ToInt64(e.Argument ));//argument Tc Kimlik No tutuyor
}
void _bgWorkerMernis_ ProgressChanged(object sender, ProgressChangedEven tArgs e)
{
lblDurum.Content += ".";
}
void _bgWorkerMernis_ RunWorkerComplet ed(object sender, RunWorkerCompletedE ventArgs e)
{
_timer.Stop( );
string ad = ((MernisService.TCKimlikNoKisiBilgi) e.Result).Ad;
//...diger bilgileri ilgili alanlara set etmek gerekiyor.
}
#endregion

Ferruh Mavituna - 04.07.2005

Application.DoEvents() olarak hala duruyor:)

ufuk - 04.07.2005

bir ara DoEvents diye bir kepazelik vardi, vb'de. O duruyor mu hala .net'te falan?

Yorum Yazın


Tüm yorumlar onaydan geçmektedir, bu işlem en uzun 30 dk. sürecektir. E-mail adresleri yeni yorumları bildirme harici hiç bir başka amaçla kullanılmamaktadır ve sitede gözükmemektedir.



Captcha Kodu