BackgroundWorker实现事件的异步模式

最近在看C#的多线程,现把BackgroundWorker实现事件的异步模式这部分用代码注释的形式写出来了,个人理解,有什么不对的还望指正。。

namespace LeranTest
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
/// <summary>
/// 使用BackgroundWorker实现事件的异步模式,BackgroundWorker涉及到三个主要的委托方法
/// DoWork:异步事件执行的方法,在该方法中实现异步处理(该方法是在新线程上执行的,不是在UI线程上执行,因此该方法不能访问UI组件)
/// RunWorkerCompleted:该方法是DoWork委托方法完成后,执行的回调方法(该方法是在UI线程上执行的,故该方法可以访问UI组件)
/// RunWorkerAsync():该方法会调用DoWork委托方法并给DoWork委托方法传递参数。
/// </summary>

BackgroundWorker backgroundWorker = new BackgroundWorker();
public Window1()
{
InitializeComponent();

}

public struct CalcInput
{
public int x;
public int y;
public CalcInput(int x,int y)
{
this.x = x;
this.y = y;
}
}

private void Calculate_Click(object sender, RoutedEventArgs e)
{
this.Calculate.IsEnabled = false;
this.ResultTextBox.Text = string.Empty;
this.Cancel.IsEnabled = true;

this.ProgressBarName.Value = 0;
backgroundWorker.WorkerReportsProgress = true;//表示能够获取用户界面的进度信息,可以动态显示进度条。在onDoWork方法中可以定义显示进度信息
backgroundWorker.WorkerSupportsCancellation = true;//表示激活取消功能,可以停止线程的运行。
backgroundWorker.DoWork += onDoWork;//注册RunWorkerAsync要执行的方法,该方法是由线程池中的新线程来执行,执行完成后会返回UI进程来执行RunWorkerCompleted中注册的方法
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(onWorkCompleted);//注册RunWorkerAsync方法执行完后要执行的方法,该方法在UI线程中执行,可以访问UI元素
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);//注册ProgressChanged方法
backgroundWorker.RunWorkerAsync(new CalcInput(int.Parse(this.XTextBox.Text), int.Parse(this.YTextBox.Text)));//参数为传入执行方法中的参数。backgroundWorker会从线程池中获取一个新的线程来执行方法。

}

private void Cancel_Click(object sender, RoutedEventArgs e)
{
backgroundWorker.CancelAsync();//调用该方法时,会设置backgroundWorker.CancellationPending属性为true,以便在onDoWork方法中检查到,取消方法的运行
}

private void onDoWork(object sender,DoWorkEventArgs e)
{
CalcInput calcinput = (CalcInput)e.Argument;//通过e.Argument来获取传入的参数
for (int i = 0; i < 10; i++)
{
Thread.Sleep(500);
backgroundWorker.ReportProgress(i * 10);//报告backgroundWorker的进度信息。该方法会引发backgroundWorker的ProgressChanged事件,该事件将空间改为UI线程。
if(backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
}
e.Result = calcinput.x + calcinput.y;//将结果传入到e.Result中,以便在后边使用该结果
}

private void onWorkCompleted(object sender,RunWorkerCompletedEventArgs e)
{
this.Calculate.IsEnabled = true;
this.Cancel.IsEnabled = false;
if (e.Cancelled)//检查是否取消了,如果取消了,显示Cancel,否则,显示计算的结果
{
this.ResultTextBox.Text = "Cancel";
}
else
{
this.ResultTextBox.Text = e.Result.ToString();
this.ProgressBarName.Value = 100;
}

}
void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.ProgressBarName.Value = e.ProgressPercentage;//给进度条赋值(进度信息)
}
}
}

时间: 2024-08-27 08:08:44

BackgroundWorker实现事件的异步模式的相关文章

基于事件的异步模式——BackgroundWorker

实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计算两个数X.Y的和为例. 程序界面如下图,其中三个文本框分别为两个加数和处理结果,两个按钮为计算和取消,按钮下方为进度条. 引入BackgroundWorker组件,为DoWork.ProgressChanged.RunWorkerCompleted三个事件指定方法.将WorkerReportsPr

MSDN搬运 之 [基于事件的异步模式]

基于事件的异步模式概述 那些同时执行多项任务.但仍能响应用户交互的应用程序通常需要实施一种使用多线程的设计方案.System.Threading 命名空间提供了创建高性能多线程应用程序所必需的所有工具,但要想有效地使用这些工具,需要有丰富的使用多线程软件工程的经验.对于相对简单的多线程应用程序,BackgroundWorker 组件提供了一个简单的解决方案.对于更复杂的异步应用程序,请考虑实现一个符合基于事件的异步模式的类. 基于事件的异步模式具有多线程应用程序的优点,同时隐匿了多线程设计中固有

C#中的异步调用及异步设计模式(三)——基于事件的异步模式

四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: ·                  “在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序. ·                  同时执行多个操作,每个操作完成时都会接到通知(在通知中可以区分是完成了哪个操作). ·                  等待资源变得可用,但不会停止(“挂起”)您的应用程序. ·  

基于事件的异步模式(EAP)

什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消.进度报告和报告结果.然而.net中并不是所有的类都支持EAP,总结起来有以下17个类支持EAP异步. System.Object的派生类型: System.Activies.WorkflowInvoke System.Deployment.Application.ApplicationD

【温故知新】C#基于事件的异步模式(EAP)

在开发winform和调用asp.net的web service引用的时候,会出现许多命名为 MethodNameAsync 的方法. 例如: winform的按钮点击 this.button1.Click += new System.EventHandler(this.button1_Click); private void button1_Click(object sender, EventArgs e) { //dosomething } 这就是基于事件的异步编程模式,它实现了不影响主线程

异步编程(二)基于事件的异步编程模式 (EAP)

一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的基于事件的异步编程模型--EAP. 实现了基于事件的异步模式的类将

基于事件的异步编程模式(EAP)

一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的基于事件的异步编程模型--EAP. 二.介绍 实现了基于事件的异步

.NET三种异步模式(APM、EAP、TAP)

APM模式: .net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法. .net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法) 1 /// <summary> 2 /// 异步 3 /// </summary> 4 /// <param name="sender"

.Net中的几种异步模式

.Net中的几种异步模式 .Net中的几种异步模式基于事件的异步模式(EAP)IAsyncResult接口简单的异步模式--引入lambdaTask手动异步编程的问题 在C# 5.0引入async之前,存在几种异步编程模式,比如Event-based Asynchronous Pattern.IAsyncResult接口.Task等等. 基于事件的异步模式(EAP) private void DumpWebPage(Uri uri) { WebClient webClient = new Web