time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > .net > WinForm > Winform中使用进度条显示长时间任务的执行进度实现示例

Winform中使用进度条显示长时间任务的执行进度实现示例

时间:2012-12-13 21:46 点击:6026次 字体:[ ]




 这个问题我们从两个部分来看,第一,长时间执行的任务如何暴露出其执行进度,第二,WinForm 窗体如何显示执行进度。

第一部分. 对象如何提供其处理进度

先看第一个问题,如果希望一个长时间执行的任务能够展示其执行进度,显然它必须提供当前执行的进度值。但是,一般来说,一个任务通常是一个方法,执行完也就完了,怎么能在一个方法的执行过程中,向外界提供其执行的进度呢?

答案就是设计模式中的观察者模式。我们可以将任务的执行者看作观察者模式中的主题,而窗体就是观察者了。在方法的执行过程中,主题不断改变其状态,而观察者通过观察主题的状态来显示其执行进度。

在 .NET 中,典型的观察者模式是通过事件来实现的。事件参数则用来提供主题的状态,System.EventArgs 为事件参数提供了基类,我们实现的事件参数应当从这个基类派生,提供自定义的额外属性。

首先定义进度状态的事件参数类,其属性 Value 表示当前进度的百分比。

  1. // 定义事件的参数类 
  2. public class ValueEventArgs  
  3.     : EventArgs 
  4.     public int Value { setget;} 

然后,定义事件所使用的委托。这个委托使用事件参数对象作为方法的参数。

  1. // 定义事件使用的委托 
  2. public delegate void ValueChangedEventHandler( object sender, ValueEventArgs e); 

最后,方法不能单独存在,我们定义业务对象,包含需要长时间执行的方法。

  1. class LongTimeWork 
  2.     // 定义一个事件来提示界面工作的进度 
  3.     public event ValueChangedEventHandler ValueChanged; 
  4.  
  5.     // 触发事件的方法 
  6.     protected void OnValueChanged( ValueEventArgs e) 
  7.     { 
  8.         ifthis.ValueChanged != null
  9.         { 
  10.             this.ValueChanged( this, e); 
  11.         } 
  12.     } 
  13.  
  14.     public void LongTimeMethod() 
  15.     { 
  16.         for (int i = 0; i < 100; i++) 
  17.         { 
  18.             // 进行工作 
  19.             System.Threading.Thread.Sleep(1000); 
  20.  
  21.             // 触发事件 
  22.             ValueEventArgs e = new ValueEventArgs() { Value = i+1}; 
  23.             this.OnValueChanged(e); 
  24.         } 
  25.     } 

注意,在这个类中,我们使用了典型的事件模式,OnValueChanged 在类中用来触发事件,将当前的进度状态提供给观察者。在 LongTimeMethod 方法中,通过调用这个方法将当前的进度提供给窗体。这个方法中通过使用 Sleep,共需花费 100 秒以上的时间才能执行完毕。



本文地址 : http://www.fengfly.com/plus/view-210890-1.html
标签: WinForm 进度条 实现示例 长时间任务 执行进度
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: