Search code examples
c#wpfmultithreadingbackgroundworker

How to use WPF Background Worker


In my application I need to perform a series of initialization steps, these take 7-8 seconds to complete during which my UI becomes unresponsive. To resolve this I perform the initialization in a separate thread:

public void Initialization()
{
    Thread initThread = new Thread(new ThreadStart(InitializationThread));
    initThread.Start();
}

public void InitializationThread()
{
    outputMessage("Initializing...");
    //DO INITIALIZATION
    outputMessage("Initialization Complete");
}

I have read a few articles about the BackgroundWorker and how it should allow me to keep my application responsive without ever having to write a thread to perform lengthy tasks but I haven't had any success trying to implement it, could anyone tell how I would do this using the BackgroundWorker?


Solution

    1. Add using

      using System.ComponentModel;
      
    2. Declare Background Worker:

      private readonly BackgroundWorker worker = new BackgroundWorker();
      
    3. Subscribe to events:

      worker.DoWork += worker_DoWork;
      worker.RunWorkerCompleted += worker_RunWorkerCompleted;
      
    4. Implement two methods:

      private void worker_DoWork(object sender, DoWorkEventArgs e)
      {
          // run all background tasks here
      }
      
      private void worker_RunWorkerCompleted(object sender, 
                                                 RunWorkerCompletedEventArgs e)
      {
          //update ui once worker complete his work
      }
      
    5. Run worker async whenever your need.

      worker.RunWorkerAsync();
      
    6. Track progress (optional, but often useful)

      a) subscribe to ProgressChanged event and use ReportProgress(Int32) in DoWork

      b) set worker.WorkerReportsProgress = true; (credits to @zagy)