前面写了几篇关于线程、BackGroundWorker等一下文章,现在主要对这些文章进行一个总结,写一篇关键异步窗体的,来实现操作的进度。
对于大型作业来说,循环处理是一件极其耗时的事情,如果都在Application的主线程中去执行,用户的界面感觉就如同死机一般,但是如果添加了进度窗体(ProcessWindow)来说,就不同了,程序会显示出一个新的窗体,而且给用户的效果是非常好的。
闲话少说,首先讲一下简单的原理:一般处理这样的事情都是一种模式,就是使用多线程或者使用微软封装好的线程控件(BackgroundWorker)去处理。原理都是一样的,就是在主线程中创建一个新的线程,我们成为子线程,子线程和主线程是并行工作的,主线程显示一个模式窗体,显示给用户看,子线程则去处理我们复杂的作业,并且提示主线程显示的模式窗体进度。知道子线程处理完一切作业,则通知模式窗体关闭或者进行其他的处理,流程图如下:
这是简单的流程,下面是代码的实现:
首先创建一个项目,名叫ProgressWindowForm,然后创建一个窗体名称叫做ProgressWindowForm,首先设置这个窗体不能最大化和关闭,在窗体上添加一个Progressbar、一个Label和Cancel按钮,代码如下:
#region
委托
/// <summary>
/// 设置显示值的委托
/// </summary>
/// <param name="text"></param>
public delegate void SetTextInvoker(String text);
/// <summary>
/// 进度显示的委托
/// </summary>
/// <param name="val"></param>
public delegate void IncrementInvoker( int val);
/// <summary>
/// 跳转到
/// </summary>
/// <param name="val"></param>
public delegate void StepToInvoker( int val);
/// <summary>
/// 设置ProgressBar的范围
/// </summary>
/// <param name="minimum"></param>
/// <param name="maximum"></param>
public delegate void RangeInvoker( int minimum, int maximum);
#endregion
#region 私有变量
/// <summary>
/// tilte
/// </summary>
/// <summary>
/// 设置显示值的委托
/// </summary>
/// <param name="text"></param>
public delegate void SetTextInvoker(String text);
/// <summary>
/// 进度显示的委托
/// </summary>
/// <param name="val"></param>
public delegate void IncrementInvoker( int val);
/// <summary>
/// 跳转到
/// </summary>
/// <param name="val"></param>
public delegate void StepToInvoker( int val);
/// <summary>
/// 设置ProgressBar的范围
/// </summary>
/// <param name="minimum"></param>
/// <param name="maximum"></param>
public delegate void RangeInvoker( int minimum, int maximum);
#endregion
#region 私有变量
/// <summary>
/// tilte
/// </summary>