How to use WPF Background Worker How to use WPF Background Worker multithreading multithreading

How to use WPF Background Worker


  1. Add using
using System.ComponentModel;
  1. Declare Background Worker:
private readonly BackgroundWorker worker = new BackgroundWorker();
  1. Subscribe to events:
worker.DoWork += worker_DoWork;worker.RunWorkerCompleted += worker_RunWorkerCompleted;
  1. 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}
  1. Run worker async whenever your need.
worker.RunWorkerAsync();
  1. 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)


You may want to also look into using Task instead of background workers.

The easiest way to do this is in your example is Task.Run(InitializationThread);.

There are several benefits to using tasks instead of background workers. For example, the new async/await features in .net 4.5 use Task for threading. Here is some documentation about Taskhttps://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task


using System;  using System.ComponentModel;   using System.Threading;    namespace BackGroundWorkerExample  {       class Program      {          private static BackgroundWorker backgroundWorker;          static void Main(string[] args)          {              backgroundWorker = new BackgroundWorker              {                  WorkerReportsProgress = true,                  WorkerSupportsCancellation = true              };              backgroundWorker.DoWork += backgroundWorker_DoWork;              //For the display of operation progress to UI.                backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;              //After the completation of operation.                backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;              backgroundWorker.RunWorkerAsync("Press Enter in the next 5 seconds to Cancel operation:");              Console.ReadLine();              if (backgroundWorker.IsBusy)              {                 backgroundWorker.CancelAsync();                  Console.ReadLine();              }          }          static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)          {              for (int i = 0; i < 200; i++)              {                  if (backgroundWorker.CancellationPending)                  {                      e.Cancel = true;                      return;                  }                  backgroundWorker.ReportProgress(i);                  Thread.Sleep(1000);                  e.Result = 1000;              }          }          static void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)          {              Console.WriteLine("Completed" + e.ProgressPercentage + "%");          }          static void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)          {              if (e.Cancelled)              {                  Console.WriteLine("Operation Cancelled");              }              else if (e.Error != null)              {                  Console.WriteLine("Error in Process :" + e.Error);              }              else              {                  Console.WriteLine("Operation Completed :" + e.Result);              }          }      }  } 

Also, referr the below link you will understand the concepts of Background:

http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/