BackgroundWorker 小结

来源:互联网 发布:中国原油10月进口数据 编辑:程序博客网 时间:2024/06/07 21:53
在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。
解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。
新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundWorker 类实现。
BackgroundWorker 类在 System.ComponentModel 命名空间下。
VS 的工具箱有一个 BackgroundWorker 组件,就是这个类。


常用方法
1.RunWorkerAsync
开始执行后台操作,引发 DoWork 事件。该方法有两个重载RunWorkerAsync(), RunWorkerAsync(object argument),第二个重载提供了一个参数,可以传递给DoWork 事件,DoWork事件的Argument参数将接收RunWorkerAsync(object argument)传递的参数。(如果有多个参数要传递怎么办,使用一个类来传递他们吧)
2.CancelAsync
请求取消挂起的后台操作。
注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查 CancellationPending 属性,来决定是否要继续执行耗时的操作。
3.ReportProgress
引发 ProgressChanged 事件。该方法有两个重载ReportProgress(int percentProgress), ReportProgress(int percentProgress, object userState),ProgressChanged 事件的ProgressPercentage 和 UserState 属性将接收ReportProgress方法传递的参数


常用属性
1.CancellationPending
指示应用程序是否已请求取消后台操作。
只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true,当后台线程运行完成会自动将该属性设置为 false。
2.WorkerSupportsCancellation
指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。
3.WorkerReportsProgress
指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。
4.IsBusy
指示后台线程是否运行中。


常用事件
1.DoWork
调用 RunWorkerAsync 方法时发生。通常将需要执行的后台程序放在DoWork事件的处理函数内,在后台程序结束时还可给DoWork事件的Result属性赋值,该属性将会被传递到RunWorkerCompleted事件的Result属性
2.RunWorkerCompleted
后台操作已完成、被取消或引发异常时发生。
3.ProgressChanged
调用 ReportProgress 方法时发生。
在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
如果想在 DoWork 事件处理程序中和用户界面的控件通信,可调用 ReportProgress 方法。


简单的程序用 BackgroundWorker 比 Thread 方便,Thread 中和用户界面上的控件通信比较麻烦,需要用委托来调用控件的 Invoke 或 BeginInvoke 方法,没有 BackgroundWorker 方便。
0 0
原创粉丝点击