How to use WPF Background Worker
- Add using
using System.ComponentModel;
- Declare Background Worker:
private readonly BackgroundWorker worker = new BackgroundWorker();
- Subscribe to events:
worker.DoWork += worker_DoWork;worker.RunWorkerCompleted += worker_RunWorkerCompleted;
- 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}
- Run worker async whenever your need.
worker.RunWorkerAsync();
Track progress (optional, but often useful)
a) subscribe to
ProgressChanged
event and useReportProgress(Int32)
inDoWork
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 Task
https://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/