CBackgroundWorker详解图例原理分析.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CBackgroundWorker详解图例原理分析

先声明,大部分资料均参考网上,进行了整理。1.在VS中添加了BackgroundWorker组件,该组件在多线程编程方面使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路,现在把我在使用它的过程中的经验与诸位分享一下。??? BackgroundWorker类中主要用到的有这列属性、方法和事件:??? 重要属性:??? 1、CancellationPending获取一个值,指示应用程序是否已请求取消后台操作。通过在DoWork事件中判断CancellationPending属性可以认定是否需要取消后台操作(也就是结束线程);??? 2、IsBusy获取一个值,指示 BackgroundWorker 是否正在运行异步操作。程序中使用IsBusy属性用来确定后台操作是否正在使用中;??? 3、WorkerReportsProgress获取或设置一个值,该值指示BackgroundWorker能否报告进度更新??? 4、WorkerSupportsCancellation获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。设置WorkerSupportsCancellation为true使得程序可以调用CancelAsync方法提交终止挂起的后台 操作的请求;??? 重要方法:??? 1、CancelAsync请求取消挂起的后台操作??? 2、RunWorkerAsync开始执行后台操作??? 3、ReportProgress引发ProgressChanged事件????? 重要事件:??? 1、DoWork调用 RunWorkerAsync 时发生??? 2、ProgressChanged调用 ReportProgress 时发生??? 3、RunWorkerCompleted当后台操作已完成、被取消或引发异常时发生??? 另外还有三个重要的参数是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。??? BackgroundWorker的各属性、方法、事件的调用机制和顺序:??? 从上图可见在整个生活周期内发生了3次重要的参数传递过程:??? 参数传递1:此次的参数传递是将RunWorkerAsync(Object)中的Object传递到DoWork事件的 DoWorkEventArgs.Argument,由于在这里只有一个参数可以传递,所以在实际应用往封装一个类,将整个实例化的类作为 RunWorkerAsync的Object传递到DoWorkEventArgs.Argument;??? 参数传递2:此次是将程序运行进度传递给ProgressChanged事件,实际使用中往往使用给方法和事件更新进度条或者日志信息;??? 参数传递3:在DoWork事件结束之前,将后台线程产生的结果数据赋给DoWorkEventArgs.Result一边在RunWorkerCompleted事件中调用RunWorkerCompletedEventArgs.Result属性取得后台线程产生的结果。??? 另外从上图可以看到DoWork事件是在后台线程中运行的,所以在该事件中不能够操作用户界面的内容,如果需要更新用户界面,可以使用ProgressChanged事件及RunWorkCompleted事件来实现。??? 明白了BagkgroundWorker的事件调用顺序和参数传递机制之后在使用该组件用于多线程编程的时候就可以轻松许多了。详细的实例可以在我写的天涯离线浏览器中看到。2.凡是WinForm的应用程序,如果他执行了一个的非常冗长的处理操作(比如文件查询),它在执行时会锁定用户界面,虽然主活动窗口 一直在运行,但用户无法与程序交互,无法移动窗体或改变窗体大小,所以用户感觉很不爽。如何做才能使得这个程序有响应。答案就是在后台线程中执行这个操 作。?? 在这里已经有了多种方法来做这个事情:?? (一)委托异步调用?将具体耗时的操作作为一个委托,并用BeginInvoke来异步执行这个委托(Invoke是同步调用),并且可以为这个操作传入参数并且通过EndInvoke方法获得返回返回值。?? (二)使用ThreadPool?新建.net FrameWork中自带的WaitCallback委托,然后放到线程池中运行ThreadPool.QueueUserWorkItem( callback ); 根据WaitCallback委托的定义,可以传入一个object类型的参数。但是不能精确的控制线程池中的线程。?? (三)使用Thread和ThreadPool相比,使用Thread的开销会比较大。但是它有它的优势,使用

文档评论(0)

cwhs + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档