How to use WPF Background Worker

前端 未结 4 1164
孤独总比滥情好
孤独总比滥情好 2020-11-22 05:53

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 t

相关标签:
4条回答
  • 2020-11-22 06:38
    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)

    0 讨论(0)
  • 2020-11-22 06:45

    I found this (WPF Multithreading: Using the BackgroundWorker and Reporting the Progress to the UI. link) to contain the rest of the details which are missing from @Andrew's answer.

    The one thing I found very useful was that the worker thread couldn't access the MainWindow's controls (in it's own method), however when using a delegate inside the main windows event handler it was possible.

    worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
    {
        pd.Close();
        // Get a result from the asynchronous worker
        T t = (t)args.Result
        this.ExampleControl.Text = t.BlaBla;
    };
    
    0 讨论(0)
  • 2020-11-22 06:53
    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/

    0 讨论(0)
  • 2020-11-22 06:55

    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

    0 讨论(0)
提交回复
热议问题