!!C# BackgroundWorker异步操作以及实现等待提示窗体功能---C#中此方法比多线程用的多
2012-09-04 16:00
621 查看
http://www.mysjtu.com/page/M0/S536/536907.html
C#中多线程中窗体的操作,异步委托写起来非常麻烦,最方便的是使用BackgroundWork组件在结束执行后返回主窗口的UI线程再调用其他窗口。
[b]C# BackgroundWorker异步操作以及实现等待提示窗体功能[/b]
2012年05月08日 ⁄ C# ⁄ 暂无评论 ⁄ 被围观 713 views+
您必须非常小心,确保在DoWork的事件处理程序中不操作任何用户资源分类界面对象。而应该通过ProgressChanged不时和RunWorkerCompleted事件与用户资源分类界面进行通信。
在项目中,由于界面的一个点击操作要处理很多事情,需要时间很久,这时整个界面就处理停滞状态,不知情的以为系统死掉了。这时候,要能给用户提供一些提示,让用户知道系统还活着并且在努力的工作,不会直接到资源管理器中杀掉进程了。由于C#是初学,通过在网上查资料实现了该功能,决定针对这个方面做个笔记。
BackgroundWorker类继承自Component。因此也是工具箱中一个组件,从“工具箱”的“组件”选项卡中拖到窗体上。如果在Window窗体设计器中使用该组件,则会出现在组件栏中,并且它的属性会显示在“属性”窗口中。
属性:
WorkerReportsProgress:指示该BackgroundWorker是否支持报告进度更新。
WorkerSupportsCancellation:指示该BackgroundWorker是否支持异步取消。
事件:
DoWork:当调用RunWorkerAsync时发生,在该事件处理程序中调用那些“耗时”的处理逻辑操作。要确保此操作中不处理任何与界面相关的对象。比如Label的赋值,进度条的赋值等。与界面的操作需要放到下面两个事件中处理。
ProgressChanged:当调用ReportProgress时发生,该事件对收到的进度更新做相应的处理操作,比如显示进度条的值或当进度为多少时给予什么提示等。
RunWorkerCompleted:当后台操作已完成、被取消或引发异常时发生。该事件主要做一些收尾工作,比如将弹出的提示窗体关闭或是当后台处理完改变某些限制变量的值等。
下面通过几个例子来说明:
2, 在主窗体中处理耗时逻辑,在等待窗体中给予进度提示。实现后台线程的启动、操作完成后的回调、后台线程的取消和进度的更新报告等。
2, 右键--添加—Window窗体,命名:AllInOneForm,该窗体完成第一个场景。
3, 右键—添加—Window窗体,命名:WaitingForm,修改自动生成的Form1为MainForm,这两个窗体完成第二个场景。
由于MainForm是启动窗体,为了完成2个场景,在该窗体中添加2个按钮:
一个命名为:新窗体完成异步操作。用于弹出AllInOneForm完成第一个场景。
一个命名为:本窗体启动等待界面。用于弹出WaitingForm完成第二个场景。
2, 从工具箱拖拽backgroundWorker组件到界面上,并修改其属性为:
Name:AllInOneBackgroundWorker
WorkerReportsProgress:true
WorkerSupportsCancellation:true
3, 从工具箱拖拽2个Button、1个Label,1个progressBar并进行如下设置:
Button1:Name:BtStart,Text:启动。
Button2:Name:BtStop,Text:停止。
Label1:Name:LbTip
progressBar1:Name:AllInOneProgressBar
3.5相应函数指定 (add by zcl )
确保在DoWork的事件处理程序中不操作任何用户资源分类界面对象。而应该通过ProgressChanged不时和RunWorkerCompleted事件与用户资源分类界面进行通信
private void Main06_Load(object sender, EventArgs e)
{
AllInOneBackgroundWorker.DoWork += new DoWorkEventHandler(AllInOneBackgroundWorker_DoWork);
AllInOneBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
AllInOneBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
}
4, 双击“启动”按钮,添加启动后台线程事件。
5, 添加后台需要做的处理,这里以for循环10个数,每次停止500毫秒,并在此报告进度。
6, 添加进度更新操作
由于要操作的控件在本窗体内,因此可以这样直接调用,在第二个场景中就不能这样调用了。
7, 添加后台处理完成操作
这里同上可以直接调用。
8, 双击“停止”按钮,添加停止后台线程事件。
运行效果:
C#中多线程中窗体的操作,异步委托写起来非常麻烦,最方便的是使用BackgroundWork组件在结束执行后返回主窗口的UI线程再调用其他窗口。
[b]C# BackgroundWorker异步操作以及实现等待提示窗体功能[/b]
2012年05月08日 ⁄ C# ⁄ 暂无评论 ⁄ 被围观 713 views+
您必须非常小心,确保在DoWork的事件处理程序中不操作任何用户资源分类界面对象。而应该通过ProgressChanged不时和RunWorkerCompleted事件与用户资源分类界面进行通信。
在项目中,由于界面的一个点击操作要处理很多事情,需要时间很久,这时整个界面就处理停滞状态,不知情的以为系统死掉了。这时候,要能给用户提供一些提示,让用户知道系统还活着并且在努力的工作,不会直接到资源管理器中杀掉进程了。由于C#是初学,通过在网上查资料实现了该功能,决定针对这个方面做个笔记。
Backgroundworker类的介绍
从字面可以理解到该类是在后台处理类,可以在单独的线程中处理比较耗时的操作,比如,上传、下载、系统初始化、资源加载、数据加载等。如果项目中需要这些功能并且不希望看到界面处理停止无响应状态,那么BackgroundWorker类可以解决这个问题。BackgroundWorker类继承自Component。因此也是工具箱中一个组件,从“工具箱”的“组件”选项卡中拖到窗体上。如果在Window窗体设计器中使用该组件,则会出现在组件栏中,并且它的属性会显示在“属性”窗口中。
属性:
WorkerReportsProgress:指示该BackgroundWorker是否支持报告进度更新。
WorkerSupportsCancellation:指示该BackgroundWorker是否支持异步取消。
事件:
DoWork:当调用RunWorkerAsync时发生,在该事件处理程序中调用那些“耗时”的处理逻辑操作。要确保此操作中不处理任何与界面相关的对象。比如Label的赋值,进度条的赋值等。与界面的操作需要放到下面两个事件中处理。
ProgressChanged:当调用ReportProgress时发生,该事件对收到的进度更新做相应的处理操作,比如显示进度条的值或当进度为多少时给予什么提示等。
RunWorkerCompleted:当后台操作已完成、被取消或引发异常时发生。该事件主要做一些收尾工作,比如将弹出的提示窗体关闭或是当后台处理完改变某些限制变量的值等。
下面通过几个例子来说明:
场景:
1, 在同一个窗体中处理后台耗时逻辑并给予进度提示。实现后台线程的启动、操作完成后的回调、后台线程的取消和进度的更新报告等。2, 在主窗体中处理耗时逻辑,在等待窗体中给予进度提示。实现后台线程的启动、操作完成后的回调、后台线程的取消和进度的更新报告等。
总体项目介绍:
1, 新建一个Window窗体应用程序。命名:BackgroundWorkerTest。2, 右键--添加—Window窗体,命名:AllInOneForm,该窗体完成第一个场景。
3, 右键—添加—Window窗体,命名:WaitingForm,修改自动生成的Form1为MainForm,这两个窗体完成第二个场景。
由于MainForm是启动窗体,为了完成2个场景,在该窗体中添加2个按钮:
一个命名为:新窗体完成异步操作。用于弹出AllInOneForm完成第一个场景。
一个命名为:本窗体启动等待界面。用于弹出WaitingForm完成第二个场景。
第一个场景实现:
1, 双击AllInOneForm窗体,打开。2, 从工具箱拖拽backgroundWorker组件到界面上,并修改其属性为:
Name:AllInOneBackgroundWorker
WorkerReportsProgress:true
WorkerSupportsCancellation:true
3, 从工具箱拖拽2个Button、1个Label,1个progressBar并进行如下设置:
Button1:Name:BtStart,Text:启动。
Button2:Name:BtStop,Text:停止。
Label1:Name:LbTip
progressBar1:Name:AllInOneProgressBar
3.5相应函数指定 (add by zcl )
确保在DoWork的事件处理程序中不操作任何用户资源分类界面对象。而应该通过ProgressChanged不时和RunWorkerCompleted事件与用户资源分类界面进行通信
private void Main06_Load(object sender, EventArgs e)
{
AllInOneBackgroundWorker.DoWork += new DoWorkEventHandler(AllInOneBackgroundWorker_DoWork);
AllInOneBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(ProgessChanged);
AllInOneBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
}
4, 双击“启动”按钮,添加启动后台线程事件。
7, 添加后台处理完成操作
8, 双击“停止”按钮,添加停止后台线程事件。
相关文章推荐
- C# 窗体间传值(Form) 几种方法,我也不懂,能实现功能,先记下来,以后研究...
- C# 鼠标穿透窗体功能的实现方法
- 黄聪:V2010中C#实现友好的等待任务完成时,出现的多线程悬浮窗体
- C# 操作EXCEL 类 可以实现导入导出功能 折腾了好长时间 现在两种方法显示出来
- C#多线程实现等待提示窗体
- C#中TextBox实现输入提示功能的方法
- 实现功能:弹出一个DIV层提示等待信息,这个时候禁用用户操作页面中的其他内容
- C#基于委托实现多线程之间操作的方法
- C#实现窗体淡入淡出效果的方法总结
- C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法
- java中实现多线程的方法有几种以及如何实现多线程
- C#透明窗体实现方法
- C#设计模式之Template模板方法模式实现ASP.NET自定义控件 密码强度检测功能
- c#devexpress GridContorl datasource为 类字段的实现方式 非datatable方式以及其他操作总结
- [转]VS2010 运行类向导提示“未实现该方法或操作”
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- (二)C#使用DsoFramer操作Excel实现查找、替换的功能
- C#类似QQ窗体抖动功能的实现
- MD5加密简介以及C#下的操作实现
- C# WinForm窗体控件Panel修改边框颜色以及边框宽度方法