Backgroundworker progress changed örneği

Backgroundworker windows application yazarken yönetilmesi kolay bir multi-thread componentidir. Farklı bir thread de yapmak istediğiniz işlemleri kolay bir şekilde yapabilir, durum değişikliklerini UI thread e gönderebilirsiniz.

Örnekte 100 birimlik bir iş yapan bir kodumuz var ve progress bar ile bu işlerin ne kadarının bittiğini kullanıcıya göstermek istiyoruz.

02.06

Form üzerinde bir adet ProgressBar ve bir adet BackgroundWorker sürükleyip bırakıyoruz. Yukarıdaki gibi görünecektir.

Daha sonra formun üstüne çift tıklayıp yada Events penceresinden Form_Load ın üzerine çift tıklayıp aşağıdaki kodları yazıyoruz.


//Main Thread
private void Form1_Load(object sender, EventArgs e)
{
//Backgroundworker in başlaması için
backgroundWorker1.RunWorkerAsync();
}

Daha sonra Backround worker in Do work eventini yakalıyor ve şu şekilde yazıyoruz. (Backgroundworker üzerine çift tıklandığında gelen event)


//Backgroundworker in Thread i
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//burda yapmak istediğimiz işlemi yapıyoruz
//örnek olarak for ile 1 den  100 e kadar rasgele bekletiyoruz.
for (int i = 0; i < 100; i++)
{
//Her birim işlem bitiminde report progress methodunu çağırıyoruz
backgroundWorker1.ReportProgress(i);
Thread.Sleep(new Random().Next(10) * 100);
}
}

Daha sonra yine Backgroundworker in ProgressChanged eventini yakalıyor ve aşağıdaki kodu yazıyoruz:


//Main Thread
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Progress değiştiğinde göstermek istediğimiz şekilde bunu ekrana gönderiyoruz
progressBar1.Value = e.ProgressPercentage;
}

Böylece her durum değişikliğinde çalışan progresschanged bize UI tarafında yapılan işlemle ilgili bilgi verebilmemizi sağlıyor. Bu işlemi direk Do_Work içerisinde yaparsak Cross-Thread olacağından exception verecektir.

3 comments to Backgroundworker progress changed örneği

  • uls oz

    Basit ve anlaşılır bir örnek olmuş teşekkürler. Fakat hala anlayamadığım şeyler var: yapılan işi % olarak gönderip progressbar’da gösteriyoruz, o anda işlenen verinin ne olduğu gibi bir bilgiyi de aynı anda ekranda göstermek istesek (bir string örneğin) ne yapabiliriz?
    Cevap verirseniz sevinirim.

  • Yılmaz Yavuz

    Eğer yaptığınız iş ile ilgili bir bilgi vermek istiyorsanız ekrana UserState alan ReportProgress methodunu kullanabilirsiniz. Ve ProgressChanged methodunda da e.UserState Şeklinde ulaşabilirsiniz.
    Ufak bir Örnek :
    [csharp]

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    //Burda işlemlerimizi yapıyoruz ve reportProgress methodunu çağırıyoruz ilk parametre yüzde ikinci parametre ise bizim yaptığımız iş ile ilgili bilgi taşıyan bir object
    //bu bir string de olabilir yada farklı bilgiler taşıyan bir poco da olabilir.
    backgroundWorker1.ReportProgress(26,”Şuanda eskişehir haritalarını işliyor”);
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    //Gelen bilgileri e parametresi üzerinden okuyabiliriz.
    MessageBox.Show(”İşlem %” + e.ProgressPercentage + ” ve ” + e.UserState);
    }
    [/csharp]

  • uls oz

    Yılmaz sen var ya adamsın! Babasın! Koçsun! Geç olsa da cevabı gördüm, tam aradığım buydu. Sağolasın.

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">