.NET WinForm中使用Timer定时更新ProgressBar的进度

简介:

在.NET WinForm程序中,大多数情况下我们是知道程序运行所需要的时间或步骤的,比如批量复制文件时文件的数量,数据导出或导入时数据的总行数等等。对于步骤比较确定的操作,如果程序执行过程时间较长,很容易使用BackgroundWorker结合ProgressBar来显示一个实时的进度。相关内容大家可以看我博客中的其它文章,有关如何使用BackgroundWorker和ProgressBar。但是,有的时候我们是不确定程序执行的具体步骤或时长的,比如连接一个远程服务或数据库服务,或者调用一个远程过程或WebService等,这个时候我们就没有办法去触发BackgroundWorker的ProgressChanged事件,因此也就不能实时去更新ProgressBar的进度了。有两种替代的办法可以解决这个问题。

  第一是将ProgressBar的Style设置为Marquee而不是默认的Blocks。在Marquee模式下,进度条会不停地向前走用来模拟一个长时间的操作。事实上,Windows中也有很多类似的进度条,大多都是出现在对操作过程所需的步骤和时长不太确定的时候。这种方法很简单,不过你仍然要将后台的执行过程放到多线程来执行,否则进度条会卡在UI线程中。一个好的办法就是依旧使用BackgroundWorker组建,将后台的执行程序放到BackgroundWorker的DoWorker事件中,然后调用BackgroundWorker的RunWorkerAsync方法来异步执行程序。这样,UI线程和后台执行程序的线程可以分开,进度条便不会再卡了。

  第二种方法是使用System.Windows.Forms.Timer定时器控件,设置好Timer的Interval间隔时间,在Timer的Tick事件中来更新ProgressBar的进度。由于Timer天生就是多线程的,所以这种办法实现起来很方便。

复制代码
 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.ComponentModel;
 4  using  System.Data;
 5  using  System.Drawing;
 6  using  System.Linq;
 7  using  System.Text;
 8  using  System.Windows.Forms;
 9  using  System.Threading;
10 
11  namespace  WindowsFormsApplication2
12  {
13       public   partial   class  Form1 : Form
14      {
15           private  BackgroundWorker worker  =   new  BackgroundWorker();
16           private  System.Windows.Forms.Timer timer  =   new  System.Windows.Forms.Timer();
17           public  Form1()
18          {
19              InitializeComponent();
20               this .progressBar1.Value  =   0 ;
21               this .progressBar1.Maximum  =   200 ;
22               this .progressBar1.Step  =   1 ;
23              timer.Interval  =   100 ;
24              timer.Tick  +=   new  EventHandler(timer_Tick);
25              worker.WorkerReportsProgress  =   true ;
26              worker.DoWork  +=   new  DoWorkEventHandler(worker_DoWork);
27              worker.RunWorkerCompleted  +=   new  RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
28              worker.RunWorkerAsync();
29              timer.Start();
30          }
31 
32           void  timer_Tick( object  sender, EventArgs e)
33          {
34               if  ( this .progressBar1.Value  <   this .progressBar1.Maximum)
35              {
36                   this .progressBar1.PerformStep();
37              }
38          }
39 
40           void  worker_RunWorkerCompleted( object  sender, RunWorkerCompletedEventArgs e)
41          {
42              timer.Stop();
43               this .progressBar1.Value  =   this .progressBar1.Maximum;
44              MessageBox.Show( " Complete! " );
45          }
46 
47           void  worker_DoWork( object  sender, DoWorkEventArgs e)
48          {
49               int  count  =   100 ;
50               for  ( int  i  =   0 ; i  <  count; i ++ )
51              {
52                  Thread.Sleep( 100 );
53              }
54          }
55      }
56  }
复制代码

   Timer每隔100毫秒便调用一次Tick事件,在该事件中更新ProgressBar的当前进度。注意需要判断ProgressBar的Value必须小于Maximum值时才去执行Performance()方法,否则会出现ProgressBar的Value大于Maximum的值而抛异常。根据BackgroundWorker的DoWork方法执行所需的时间长短不同,ProgressBar的进度可能会在BackgroundWorker执行具体操作完成之前到达100%,也可以没有到达100%,所以在BackgroundWorker的RunWorkerCompleted事件中将ProgressBar的进度更新为100%,以确保进度在最后是一个完成的状态。

  如果你在应用程序中确实需要使用进度条来提示用户后台程序在完成一个耗时较长的操作,而且你还希望进度条能尽量模拟出程序执行的步骤,而不是一个Marquee状态,可以考虑使用Timer定时器控件。因为,有的时候我们确实很难评估一个执行过程到底需要多少步骤或者需要多长时间才能完成。  


本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2011/08/05/2128811.html,如需转载请自行联系原作者


相关文章
|
5月前
|
编解码 JSON 算法
一个支持.Net 7的WinForm开源UI组件框架
一个支持.Net 7的WinForm开源UI组件框架
81 0
|
9月前
|
数据库 C#
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
218 0
|
开发框架 Windows
RDIFramework.NET V3.3 WinForm版新增订单管理主从表事例
无论什么系统,除了常规的单表处理外,主从表的应用都是非常普遍的,RDIFramework.NET V3.3 WinForm版本中新增了一个主从表的事例供大家参考。主从表的界面设计大同小异,主要还是在处理CRUD操作时的一些特殊性,如:新增、修改、删除操作要放在同一事务提交,删除主表数据,从表对应数据也应相应删除等。
1707 0
|
C#
.NET Timer控件基础用法
使用C#的Timer控件来实现定时触发事件,其主要参数如下: Timer.Enabled 属性用于设置是否启用定时器 Timer.Interval 属性,事件的间隔,单位毫秒 Timer.
1172 0
|
C语言 C++ C#
MONO 如何打包 .NET程序独立运行(winform篇)
.NET程序独立运行是指运行.NET的电脑上,不需要安装.NET框架。 .NET程序集“独立运行”并非真正的独立,它是运行在mono运行时基础之上的。由于这个运行时可以独立存在,所以,我们不需要在目标机上安装.NET框架。
2200 0
|
物联网 数据库管理 数据安全/隐私保护
RDIFramework.NET开发实例━表约束条件权限的使用-WinForm
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/42674991 RDIFramework.NET开发实例━表约束条件权限的使用-WinForm               在实际的应用中,客户常有这样的需求,指定用户或角色可以看指定条件下的数据,这里的“指定条件”在RDIFramework.NET框架中,我们称作为“用户或角色的约束条件表达式”。
871 0
|
物联网 开发框架 数据库管理
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-WinForm部分
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/42420297 RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增岗位管理-WinForm部分     岗位(职位)管理模块主要是针对组织机构的岗位(职位)进行管理,包括:增加、修改、删除、移动、对岗位设置用户,设置岗位的权限等。
914 0
|
存储 中间件 测试技术
RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/24978691 RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发、整合框架,给用户和开发者最佳的.Net框架部署方案。
1135 0
|
数据库连接 项目管理 数据库
.NET快速开发整合框架(RDIFramework.NET)【开发实例】之产品管理(WinForm)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/7992270 .
1255 0
|
并行计算 API Windows
浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础上
首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下: Thread.Sleep(1000); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append("test"); string s = sb.ToString(); textBox1.Text = s; 首先我们可以把这个操作理解为一个非常耗时的操作,它至少占用1秒的时间。
768 0