标签:
最近在看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;//给进度条赋值(进度信息)
}
}
}
标签:
原文地址:http://www.cnblogs.com/yiyuweier/p/5075378.html