如何使用WPF后台工作程序

Eam*_*voy 174 c# wpf multithreading backgroundworker

我是WPF的初学者,在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要7-8秒才能完成,在此期间我的UI变得无法响应.为了解决这个问题,我在一个单独的线程中执行初始化:

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

public void InitializationThread()
{
    outputMessage("Initializing...");
    //DO INITIALIZATION
    outputMessage("Initialization Complete");
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些文章BackgroundWorker,关于它应该如何允许我保持我的应用程序响应,而不必编写一个线程来执行冗长的任务,但我没有成功地尝试实现它,任何人都可以告诉我怎么做这个使用BackgroundWorker

谢谢,Eamonn

And*_*ich 314

1.添加以下内容: ProgressChanged

2.Declare 后台工作人员:

using System.ComponentModel;
Run Code Online (Sandbox Code Playgroud)

3.订阅活动:

private readonly BackgroundWorker worker = new BackgroundWorker();
Run Code Online (Sandbox Code Playgroud)

4.实现两种方法:

worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
Run Code Online (Sandbox Code Playgroud)

5.无论何时需要,运行工作都是异步的.

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 Code Online (Sandbox Code Playgroud)

此外,如果要报告进程进度,则应订阅ReportProgress(Int32)事件并DoWorkworker.WorkerReportsProgress = true;方法中使用以引发事件.还设置如下:( ProgressChanged感谢@zagy)

希望这有帮助.


Owe*_*son 36

您可能还希望使用Task而不是后台工作程序.

最简单的方法是在你的例子中Task.Run(InitializationThread);.

使用任务而不是后台工作程序有几个好处.例如,.net 4.5中的新async/await功能Task用于线程.这里有一些关于http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx的文档.Task

  • 很抱歉发现这个帖子,但.net 4.0和4.5添加了一些比"BackgroundWorker"更容易使用的酷东西.希望引导人们去做. (10认同)
  • 现在这个答案已经非常旧了,请查看“async”和“await”。这些是以更易读的方式使用任务的语言集成方式。 (2认同)

Gul*_*had 14

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);  
            }  
        }  
    }  
} 
Run Code Online (Sandbox Code Playgroud)

另外,请参考以下链接,您将了解以下概念Background:

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