C#BackgroundWorker控件使用_第1页
C#BackgroundWorker控件使用_第2页
C#BackgroundWorker控件使用_第3页
C#BackgroundWorker控件使用_第4页
C#BackgroundWorker控件使用_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论