开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6380|回复: 2
收起左侧

[C#图文教程] 超好用的BackgroundWorker

[复制链接]
发表于 2018-3-5 14:19:23 | 显示全部楼层 |阅读模式   湖北省武汉市
在System.ComponentModel名称空间下,BackgroundWorker是对线程的封装,非常好用,它有二个重要的属性,WorkerSupportsCancellation=True表示线程支持取消架构,WorkerReportsProgress=True表示线程可以通知进度。三个重要的事件,DoWork是最主要的事件,不能在这个事件里访问界面,在ProgressChanged事件里可以访问界面,参数E.ProgressPercentage表示进度,是个int类型,RunWorkerCompleted 事件表示运行结束,在这个事件里可以做点收尾工作。
下面展示一下BackgroundWorker有多么的易用,先实例二个BackgroundWorker对象worker1和worker2,worker1.WorkerSupportsCancellation = true;
            worker1.WorkerReportsProgress = true;
  1. worker1.DoWork += (sender, e) =>
  2.              {
  3.                  for (int i = 1; i <= 100; i++)
  4.                  {
  5.                      if (worker1.CancellationPending)
  6.                          return;
  7.                      worker1.ReportProgress(i, i.ToString());
  8.                      Task.Delay(600).Wait();
  9.                  }
  10.              };
复制代码
然后添加DoWork事件,用lamda书写更简单,sender是object类型参数,e是DoWorkEventArgs类型参数,写一个循环,从1-100,在循环中判断是否取消,如果取消就返回,if (worker1.CancellationPending) return; 然后报告进度 worker1.ReportProgress(i, i.ToString()); 第一个参数是整数进度百分比,第二个参数是一个object对象,可以传任意对象。
  1. worker1.ProgressChanged += (sender, e) =>
  2.              {
  3.                  lstInteger.Items.Add(e.UserState as string);
  4.                  lstInteger.ScrollIntoView(lstInteger.Items[lstInteger.Items.Count - 1]);
  5.              };
复制代码
然后添加进度事件,在事件里访问界面里的整数列表ListBox,

  1. worker1.RunWorkerCompleted += (sender, e) =>
  2.              {
  3.                  Execute.IsEnabled = true;
  4.                  Cancel.IsEnabled = false;
  5.              };
复制代码
然后添加完成事件,做些收尾工作,Execute和Cancel是二个按钮。
worker2与worker1是一样的,让这二个线程同时访问界面列表ListBox,在代码里没有锁,不会有任何问题。
初始化二个对象后,可以调用worker1.RunWorkerAsync();worker2.RunWorkerAsync();运行线程,要取消线程可以调用worker1.CancelAsync(); worker2.CancelAsync();完整代码见附件,编译平台visual studio 2017。


WpfApp1.rar

45.75 KB, 下载次数: 3, 下载积分: 精币 -2 枚

例子

结帖率:42% (5/12)

签到天数: 23 天

发表于 2018-6-3 15:40:58 | 显示全部楼层   湖南省永州市
没事过来 悄悄
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:100% (2/2)
发表于 2018-3-5 14:56:24 | 显示全部楼层   江苏省南通市
沙发
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表