27 Eylül 2012 Perşembe

C# ile BackgroundWorker

Merhaba Webkolog okurları! Bugün C# .Net Framework 4 ve Visual Studio 2010 kullanarak uygulamalarımızda uzun süren işlemleri arka planda gerçekleştirmek ve kullanıcı arayüzünü bloke etmemek için kullandığımız BackgroundWorker kontrolünü yakından inceleyeceğiz. BackgroundWorker, özellikle zaman alan işlemlerin (dosya kopyalama, veritabanı sorguları, ağ işlemleri vb.) kullanıcı deneyimini olumsuz etkilememesini sağlamak için önemlidir. Gelin, bu kontrolün temel özelliklerine ve kullanımına birlikte göz atalım.

BackgroundWorker Kontrolü Nedir?

BackgroundWorker kontrolü, bir işlemi ana uygulama iş parçacığından (UI thread) ayrı bir iş parçacığında (thread) çalıştırmamızı sağlayan bir bileşendir. Bu sayede, uzun süren işlemler uygulama arayüzünü bloke etmez ve kullanıcı etkileşimine açık kalır.

BackgroundWorker Kontrolünü Kullanma

  1. BackgroundWorker Oluşturma:
    • Visual Studio 2010'da, Toolbox'tan bir BackgroundWorker kontrolünü formunuza sürükleyerek veya kodda bir BackgroundWorker nesnesi oluşturarak başlayabilirsiniz.
  2. DoWork Olayını İşleme:
    • DoWork olayı, arka planda çalışacak olan kodu içerir. Bu olayda, uzun süren işlemleri gerçekleştiririz.
  3. ProgressChanged Olayını İşleme (İsteğe Bağlı):
    • ProgressChanged olayı, arka plandaki işlemin ilerlemesini kullanıcı arayüzüne bildirmek için kullanılır. Bu olayda, ilerleme durumunu (yüzde olarak) ve isteğe bağlı kullanıcı verilerini güncelleyebiliriz.
  4. RunWorkerCompleted Olayını İşleme (İsteğe Bağlı):
    • RunWorkerCompleted olayı, arka plandaki işlem tamamlandığında tetiklenir. Bu olayda, sonucu alabilir, hataları işleyebilir ve kullanıcı arayüzünü güncelleyebiliriz.

Örnek Kullanım

Aşağıdaki örnekte, bir BackgroundWorker kullanarak bir dosya kopyalama işlemini arka planda gerçekleştirmeyi ve ilerleme durumunu bir ProgressBar ile göstermeyi ele alıyoruz:

private void button1_Click(object sender, EventArgs e)
{
    // Arka plan işlemini başlatın.  "Yol" argümanını DoWork olayına gönderir.
    backgroundWorker1.RunWorkerAsync("Yol");
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // Arka plan iş parçacığında çalışacak kod.
    string yol = e.Argument.ToString(); // Gönderilen argümanı alın.
    // Dosya kopyalama işlemini burada gerçekleştirin.
    // ...
    // İlerleme durumunu bildirin (isteğe bağlı).
    // backgroundWorker1.ReportProgress(yuzdeTamamlanma, durumMesaji);
     for (int i = 0; i <= 100; i++)
     {
        Thread.Sleep(100);
        backgroundWorker1.ReportProgress(i, $"Dosya kopyalanıyor... {i}%");
     }
    e.Result = "İşlem Tamamlandı"; // Sonucu RunWorkerCompleted olayına gönderin.
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Kullanıcı arayüzü iş parçacığında çalışacak kod.
    // İlerleme çubuğunu ve/veya diğer UI öğelerini güncelleyin.
    listBox1.Items.Add(e.UserState);
    progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     if (e.Error != null)
     {
        MessageBox.Show("Hata oluştu: " + e.Error.Message);
     }
     else if (e.Cancelled)
     {
        MessageBox.Show("İşlem iptal edildi.");
     }
     else
     {
        MessageBox.Show(e.Result.ToString());
     }
}

Bu örnekte, button1_Click olayında RunWorkerAsync() metodunu çağırarak arka plan işlemini başlatıyoruz. DoWork olayında dosya kopyalama işlemini gerçekleştiriyoruz. ReportProgress() metodu ile ilerleme durumunu ProgressChanged olayına bildiriyoruz. ProgressChanged olayında ise ProgressBar ve ListBox kontrollerini güncelleyerek kullanıcıya geri bildirim sağlıyoruz. RunWorkerCompleted olayında ise işlemin sonucunu veya bir hata oluşup oluşmadığını kontrol ediyoruz.

BackgroundWorker Kontrolünün Özellikleri

  • WorkerReportsProgress: Arka plan işleminin ilerleme bildirimlerini destekleyip desteklemediğini belirtir.
  • WorkerSupportsCancellation: Arka plan işleminin iptal edilip edilemeyeceğini belirtir.

BackgroundWorker Kontrolünün Olayları

  • DoWork: Arka planda çalışacak olan kodu içerir.
  • ProgressChanged: İlerleme durumu değiştiğinde tetiklenir.
  • RunWorkerCompleted: Arka plan işlemi tamamlandığında tetiklenir.

BackgroundWorker Kontrolünün Metotları

  • RunWorkerAsync(): Arka plan işlemini başlatır.
  • ReportProgress(): İlerleme durumunu bildirir.
  • CancelAsync(): Arka plan işlemini iptal etmeye çalışır.
  • Reset(): BackgroundWorker'ı yeniden kullanılabilir hale getirir.

Önemli Notlar:

  • UI Thread Erişimi: DoWork olayında asla doğrudan kullanıcı arayüzü kontrollerine erişmeyin. UI kontrollerine sadece ProgressChanged ve RunWorkerCompleted olaylarında erişebilirsiniz, çünkü bu olaylar UI thread üzerinde çalışır.
  • İptal Desteği: Arka plan işleminin iptal edilebilir olması için WorkerSupportsCancellation özelliğini true olarak ayarlayın ve DoWork olayında CancellationPending özelliğini kontrol ederek iptal isteğini işleyin.

Sevgili Webkolog okurları, C# .Net Framework 4 ve Visual Studio 2010 kullanarak BackgroundWorker kontrolünün temel kullanımını ve bazı önemli özelliklerini bu şekilde incelemiş olduk. Bu kontrol, uygulamalarınızda uzun süren işlemleri arka planda gerçekleştirerek kullanıcı deneyimini artırmanıza ve uygulamanızın daha hızlı ve duyarlı olmasını sağlamanıza yardımcı olur.

Webkolog'u takipte kalın!

Hepinize bol iş parçacıklı ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder