




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c# backgroundworker 控件使用c# backgroundworker控件使用分享backgroundworker是一个非常不错的线程控件,能避免界面假死,让线程操作你想要 做的事,它学习起来很简单,但是能实现很强大的功能。发布这篇文章的目的是将最近学 习到的共享出来,大家交流一下,当然我也是菜鸟,在这里你将学习到backgroundworker 简单使用,停止,暂停,继续等操作,backgroundworker比起thread和threadpool要简 单太多,为了更方便在实际应用中使用,我使用的是winform,没有使用控制台程序。在 ui界面里拖动1个button和ric
2、htextbox到界面。我会从最简单的开始,只有最简单的代码才会让人有继续学下去的欲望,下列代码可 以将1到999打印到richtextboxl控件上。复制代码 代码如下:private void buttonl_click(object sender, eventargs e) 创建一个 backgroundworker 线程backgroundworker bw = new backgroundworker 0;创建一个dowork事件,指定bw_dowork方法去做事 bw. dowork += new doworkeventhandler (bw_dowork);开始执行bw. run
3、workerasync () ; void bw_dowork(object sender, doworkeventargs e) for (int i = 0; i 1000; i+)this.richtextboxl.text += i + environment. newline; 但是很不幸,以上代码会报错,报错信息:线程间操作无效:从不是创建控件 “richtextboxl”的线程访问它。那么我们继续改造代码,让数字显示在richtextboxl控件上,并且让richtextboxl 焦点处于最低端。复制代码代码如下:private void buttonl_click(object
4、 sender, eventargs e) 创建一个 backgroundworker 线程backgroundworker bw = new backgroundworker();创建一个dowork事件,指定bw_dowork方法去做事 bw. dowork += new doworkeventhandl er (bw-dowork);开始执行bw. runworkerasync () ; void bw_dowork(object sender, doworkeventargs e) for (int i = 0; i 1000; i+)this. invoke(methodinvoke
5、r)delegatethis.richtextboxl. text += i + environment. newline;); private void richtextboxl_textchanged(object sender, eventargs e) richtextbox textbox = (richtextbox)sender;textbox. selectionstart = textbox. text.length; textbox. scrolltocaret (); 上面是backgroundworker一个最简单的例子,没有多余复杂的代码,这就是 background
6、worker下面我们加入停止按钮,让线程停下来。再拖动一个button控件到界面,让线程停止我们先要改造一下代码,让button事件 也能控制到backgroundworker线程。复制代码代码如下:backgroundworker bw = null;private void buttonl_click(object sender, eventargs e) 创建一个 backgroundworker 线程bw = new backgroundworker 0 ;/指定可以让线程停止bw. workersupportscancellation = true;创建一个dowork事件,指定bw
7、_dowork方法去做事 bw. dowork += new doworkeventhandler (bw_dowork); 开始执行bw. runworkerasync () ; private void button2_click(object sender, eventargs e) 停止线程bw. cancelasync () ; void bw_dowork(object sender, doworkeventargs e) for (int i = 0; i 1000; i+)获取当前线程是否得到停止的指令if (bw. cancellationpending)e. cancel
8、= true;return;this.invoke(methodinvoker)delegatethis. richtextboxl.text += i + environment. newline;); 为了避免代码的复杂化,上面代码我没有做更多的体验修改,比如点击开始的按钮, 开始的按钮应该为不可用状态,点击停止按钮后停止按钮不可用状态,激活开始按钮。 下面我们将继续升级,如何来获知线程是否己经执行完成或者线程已经停止了呢复制代 码代码如下:backgroundworker bw = null;private void buttonl_click(object sender, eventa
9、rgs e) bw = new backgroundworker 0;bw. workersupportscancellation = true;bw. dowork += new doworkeventhandler (bw_dowork); 线程完成或者停止发 生的事件bw. runwork er comp 1 e t e d += newrunworkercompletedeventhandler(bw_runworkercompleted);bw. runworkerasync 0; private void button2_click(object sender, eventargs
10、 e) bw. cancel async () ; void bw_dowork(object sender, doworkeventargs e) for (int i = 0; i 1000; i+)if (bw. cancellationpending)e. cancel = true;return;);this. invoke(methodinvoker)delegatethis.richtextboxl. text += i + environment. newline;void bw_runworkercompleted(object sender, runworkercomple
11、tedeventargs e)if (e. cancelled) this. richtextboxl. text +=、线程已经停止、 else this. richtextboxl. text +=、线程已经完成、 到现在为止你可以自己去用backgroundworker创建一个线程了,你已经了解它了, 当然backgroundworker还有一个reportprogress滚动条事件,可以显示进度,我暂旦认 为它是多余的,因为大部分进度都可以通过bw_dowork来控制实现。下面我们继续完善 backgroundworker加入暂停和继续功能。再拖动一个button控件到界面, back
12、groundworker的暂停和继续我们使用manualre set event复制代码 代码如下:backgroundworker bw = null; 创建 uanualreseteventmanualresetevent mr = new manua1resetevent(true);private void buttonl_click(object sender, eventargs e) bw = new backgroundworker 0;bw. workersupportscancellation = true;bw. dowork += new doworkeventhand
13、ler(bw_dowork); bw. runworkercompleted += new runworkercompletedeventhandler(bw_runworkercompleted);bw. runworkerasync () ; private void button2_click(object sender, eventargs e) bw. cancel async () ; private void button3_click(object sender, eventargs e) button b = (button) sender; if (b. text = 暂停mr. reset ();b. text = 继续else(mr. set ();b. text = 暂停void bw_dowork(object sender, doworkeventa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营养与膳食理论知识考核试题题库及答案
- 油库操作规程汇编范文
- 国际贸易公司仓储厂房承包及物流服务合同
- 生态工业园区厂房小卖部使用权转让合同范本
- 竞品项目拦截方案
- 成都商业地产商铺租赁与商业环境改善合同
- 事业单位人员创业指导与离职创业服务合同
- 自然护岸施工方案
- 物业公司代收车位租赁费及管理费协议
- 消防审核面试题及答案
- 系统压力测试评估执行规范
- 社会救助政策培训
- 工艺管理培训课件
- DB3702-T 0009-2020 市民诉求数据分析与应用规范
- 坐大巴车安全教育
- 广西建设职业技术学院博士高层次人才招考聘用高频重点提升(共500题)附带答案详解
- 2025房屋的室内装修合同模板
- 军事训练伤病预防
- 阿尔伯特;哈伯德-把信送给加西亚
- 2025中级消防设施操作员作业考试题及答案(1000题)
- 铁路货物运价规则
评论
0/150
提交评论