最近需要用到BackgroundWorker类来实现一个数据库访问,在服务器端生成文件,客户端文件下载的功能,为了使界面更友好,所以使用了BackgroundWorker类,下面是研究过程中的心得
关于异步线程
1、命名空间
using System.ComponentModel;
2、声明
BackgroundWorker bkgw_异步线程 = new BackgroundWorker();
3、属性
//是否允许报告进度,通过ReportProgress触发事件
bkgw_异步线程.WorkerReportsProgress = true;
//是否允许异步取消,可以执行中通过CancellationPending属性来判断是否取消
bkgw_异步线程.WorkerSupportsCancellation = true;
//是否已请求取消线程,通过bkgw_异步线程.CancelAsync()方法触发
bkgw_异步线程.CancellationPending
//线程是否正在后台运行
bkgw_异步线程.IsBusy
4、事件
//线程开始事件,通过函数RunWorkerAsync触发
bkgw_异步线程.DoWork
参数DoWorkEventArgs e有几个重要属性
e.Argument由函数RunWorkerAsync可传入一个object对像参数
e.Cancel表示异步是否已取消,当bkgw_异步线程.CancellationPending为true时,能过e.Cancel=true取消线程
e.Result,object类型,这个传会传入到RunWorkerCompleted事件中的e
注意,在此事件中,不能操作任务主线程中的对像,例如主线程中的UI元素,否则会报线程安全异常
//线程执行中事件,必须要将程WorkerReportsProgress 属性设置为true
bkgw_异步线程.ProgressChanged
参数ProgressChangedEventArgs e有几个重要属性
e.ProgressPercentage表示进度,通过函数ReportProgress(1)可以传入表示进度的值,范围0-100
注意,在此事件中,可以访问主线程UI中的元素对像,比如进度条、文本框等
//线程执行完成、取消、发生异常时发生
bkgw_异步线程.RunWorkerCompleted
参数RunWorkerCompletedEventArgs e几个重要属性
e.Error如果不为null值,表示发生了异常,可以能过e.Error.Message取得异常信息
e.Result由DoWork事件的参数e.Result属性将值传过来
e.Cancelled如果取消线程,此参数为true
5、函数
//开始线程
bkgw_异步线程.RunWorkerAsync(tb_数值.Text);
//取消线程
bkgw_异步线程.CancelAsync();
//报告线程进度
bkgw_异步线程.ReportProgress(percentDone);
6、进度条对像的几个重要属性
progressBar1.Value进度条递增一个值,前进一格
progressBar1.IsIndeterminate = true;进度条为重复模式,在不知道操作结束时,可以使用此模式
progressBar1.IsIndeterminate = false;取消重复模式
7、实例代码,输入一个数字N,实现1-N的累加,例子是看到书上的,增加了一些自己的体会
private void M_线程开始事件(object sender,DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
e.Result = M_线程主体(double.Parse(e.Argument.ToString()), worker, e);
}
private void M_线程执行中(object sender,ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Content = e.ProgressPercentage.ToString() + “%”;
}
private void M_线程结束(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled != null)
{
MessageBox.Show(e.Error.Message);
}
else
{
label1.Content = “1到”+tb_数值.Text +”的累加值为”+e.Result.ToString();
rab_开始.IsEnabled = true;
rab_停止.IsEnabled = false;
}
}
private double M_线程主体(double number,BackgroundWorker worker,DoWorkEventArgs e)
{
int lastPercent = 0;
double sum = 0;
for (double i = 0; i <= number; i++)
{
//如果为true,表示已进行取消操作
if (worker.CancellationPending)
{
e.Cancel = true;
}
else
{
sum = sum + i;
//被10整除
if (i % 10 == 0)
{
int percentDone = (int) ((i/number) * 100);
if (percentDone > lastPercent)
{
worker.ReportProgress(percentDone);
lastPercent = percentDone;
}
}
}
}
return 8899;
}
private void rab_开始_Click(object sender, RoutedEventArgs e)
{
double d=999999999;
if (!double.TryParse(tb_数值.Text, out d))
{
MessageBox.Show(“请输入有效数字”);
return;
}
rab_停止.IsEnabled = true;
rab_开始.IsEnabled = false;
progressBar1.Value = 0;
bkgw_异步线程.RunWorkerAsync(tb_数值.Text);
}
private void rab_停止_Click(object sender, RoutedEventArgs e)
{
bkgw_异步线程.CancelAsync();
rab_开始.IsEnabled = true;
rab_停止.IsEnabled = false;
}
private void radButton1_Click(object sender, RoutedEventArgs e)
{
progressBar1.IsIndeterminate = true;
}
private void radButton2_Click(object sender, RoutedEventArgs e)
{
progressBar1.IsIndeterminate = false;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38904.html