在各种类型的应用程序中,为了给用户提供良好的应用体验,如果某一处理过程的时间很长,我们就要对用户展示该处理过程的进度信息。
在.net framework的开发中,为了不打破对象化的结构,我们可以使用下面的方式实现。
在该处理过程所属对象上添加System.ComponentModel.AsyncCompletedEventHandler和System.ComponentModel.ProgressChangedEventHandler事件。
代码如下:
class ObjectA
{
public void Do()
{
try
{
for (int i = 0; i < Length; i++)
{
if (_BeCancelled)
{
new WaitCallback(RaiseDoneEvent).Invoke(new AsyncCompletedEventArgs(null, true, this));
return;
}
else
{
//计算进度百分数percentAge
new WaitCallback(RaiseDoingEvent).Invoke(new ProgressChangedEventArgs(percentAge, this));
}
}
new WaitCallback(RaiseDoneEvent).Invoke(new AsyncCompletedEventArgs(null, false, this));
}
catch (Exception e)
{
new WaitCallback(RaiseDoneEvent).Invoke(new AsyncCompletedEventArgs(e, false, this));
}
}
#region 事件
/// <summary>
/// 当处理完成时,触发此事件
/// </summary>
public event AsyncCompletedEventHandler Done;
/// <summary>
/// 在处理过程中,进度发生变化时,触发此事件
/// </summary>
public event ProgressChangedEventHandler Doing;
private void RaiseDoneEvent(object arg)
{
if (Done!= null)
Done(this, (AsyncCompletedEventArgs)arg);
}
private void RaiseDoingEvent(object arg)
{
if (Doing!= null)
Doing(this, (ProgressChangedEventArgs)arg);
}
#endregion
}
这样,外部代码就可以通过上面两个事件的参数信息获得指定处理过程的进度信息了。