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)事件并DoWork在worker.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
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/
| 归档时间: |
|
| 查看次数: |
167935 次 |
| 最近记录: |