backgroundworker类

来源:互联网 发布:sql删除全部数据 编辑:程序博客网 时间:2024/06/10 16:59

前段时间用到了backgroundworker类做了一个简单的读取后台数据到界面datagridview中的程序,今天又用到了这个类
,碰到了些问题,这里总结下:

概述:
BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会
导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延
迟,则可以使用 BackgroundWorker 类方便地解决问题。

msdn中有段话值得注意:
您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 
RunWorkerCompleted 事件与用户界面进行通信。
意思是说在do_work事件处理程序中直接访问界面控件是会出错的,因为do_work事件处理程序处于UI界面不同的线程中
。此时要想访问界面控件(例如给toolstripprogressbar加上一格)需要调用控件的invoke方法,(此方法需要传入一个
处理方法的委托。)即可.
在调用此类时,有几次参数传递过程:

1:开始执行异步操作时(调用RunWorkerAsync方法即开始),系统会将该方法的参数(类型为object)传递给dowork事件
处理程序(已经位于另一个线程上了)
此方法会发出一个开始异步执行的请求,将触发dowork事件,随即开始执行后台操作.此时如果后台操作已经在执行,将
引发InvalidOperationException异常.后台操作是否在执行可通过backgroundworker.IsBusy属性来判断.
参数设定处:RunWorkerAsync(**********)
参数接收处:dowork事件处理程序内:e.Argument

2:调用backgroundworker实例的ReportProgress方法时,此方法将引发ProgressChanged事件,参数将会从ReportProgress
方法传到ProgressChanged事件的处理程序中,有一个前提是backgroundworker实例必须能够报告进度更新
参数设定处:dowork事件处理程序内:ReportProgress(**********,*********)
参数接收处:ProgressChanged事件处理程序内:e.ProgressPercentage和e.UserState

3:dowork事件处理程序返回时,此时将会引发RunWorkerCompleted事件,参数将会从dowork事件处理程序中传
到RunWorkerCompleted方法中,可从此事件的参数e中获取传递过来的信息.
参数设定处:dowork事件处理程序内,e.Result=************;
参数接收处:RunAsync事件处理程序内,e.Result=************;
以上三点理解起来很简单,但在实际操作时要注意
在dowork事件处理程序内部用control.invoke方法访问界面控件时需要传入相应的委托和委托关联的方法的参数,此参数是
以object数组的形式传入的,就算委托绑定的方法的参数本身就是object数组,也不可直接传递,还是要构建另一个数组。

原创粉丝点击