Bu makaleyi isteğe bağlı olarak, Microsoft Sway üzerinden okuyabilirsiniz !

C# üzerinden geliştirmekte olduğunuz uygulamada aynı anda farklı işlemler yaptırmak istediğinizde, uygulamamız için ayrılan tek Thread kullanılır. Bu Thread kod parçalarını yerine getirmek için çalıştığı anda uygulamamız görselliğini kaybedebilir. Kullanıcının uygulama üzerinde işlemine devam etmesi Thread cevap verene kadar donacaktır. Buda uygulamanın çökmesine sebeb olacaktır.

BackgroundWorker nedir ?

BackgroundWorker yukarıdaki örneğime çözüm olarak kullanılabilir bir araçtır.

Bu bileşen sayesinde uygulamanızda aynı anda birden fazla işlem yaptırabilirsiniz.

BackgroundWorker aracını Toolbox içerisinden projemize ekleyebiliriz.

toolbox

BackgroundWorker 3 event içermektedir.Bunlar şu şekilde

DoWork

İş parçasını içeren event

ProgressChanged

Durumun değişmeleri esnasında yapılacak olan işlemler

Örnek olarak uygulamamızın ilerleyişini ProgressBar ile göstermek istersek bu bölüme ilgili kodları yazacağız.

RunWorkerCompleted

Çalışma zamanının sonunda ne yapılacağı ise buraya yazılmalıdır.


Şimdi örnek olarak basit bir proje geliştirelim.

Toolbox’dan 2 BackgroundWorker,Button,ProgressBar ekledik.

Daha sonra properties bölümünden raporlama ve durdurulma özelliklerine true değer atadık. Bu işlem form üzerinden kod ilede yapılabilir.

2017-02-28_20-38-11.png

Veya Formload olayına şu kodları yazabilirsiniz.


backgroundWorker2.WorkerReportsProgress = true;
backgroundWorker2.WorkerSupportsCancellation = true;

Daha sonra BackgroundWorker event kısmından yukarıdaki eventleri oluşturuyoruz.

2017-02-28_20-47-15.png

DoWork olayına basit bir arttırma yazalım ve progressbar değerini değişken değeri dolduralım.


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for(int sam =1;sam<=100;sam++)
{
backgroundWorker1.ReportProgress(sam);

// Reportprogress olayına sam adlı değişkenin durumunu gönderiyoruz.
}
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;

// Progressbar değerini gelen veri ile dolduruyoruz.

}

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
for(int ss =0;ss<=100;ss++)
{
backgroundWorker2.ReportProgress(ss);
}
}

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar2.Value = e.ProgressPercentage;
}

// Başlat tusu

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.RunWorkerAsync();
}

// Durdur tusu

private void button2_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}

Bu şekilde 2 farklı işlemi aynı anda gerçekleştirebiliriz.

Örnek projeyi buradan indirebilirsiniz.

Reklamlar