异步编程:基于事件的异步编程模式(EMP)
作者:网络转载 发布时间:[ 2013/4/7 10:23:29 ] 推荐标签:
3、注意:
1)确保 ***EventArgs类特定于***方法。即当使用 ***EventArgs类时,切勿要求开发人员强制转换类型值。
2)确保始终引发方法名称Completed 事件。成功完成、异常或者取消时应引发此事件。任何情况下,应用程序都不应遇到这样的情况:应用程序保持空闲状态,而操作却一直不能完成。
3)确保可以捕获异步操作中发生的任何异常并将捕获的异常指派给 Error 属性。
4)确保 ***CompletedEventArgs 类将其成员公开为只读属性而不是字段,因为字段会阻止数据绑定。eg:public MyReturnType Result { get; }
5)在构建 ***CompletedEventArgs 类属性时,通过this.RaiseExceptionIfNecessary()方法确保属性值被正确使用。Eg:
private bool isPrimeValue;
public bool IsPrime
{
get
{
RaiseExceptionIfNecessary();
return isPrimeValue;
}
}
所以,在***Completed事件处理程序中,应当总是先检查 ***CompletedEventArgs.Error 和 ***CompletedEventArgs.Cancelled 属性,然后再访问RunWorkerCompletedEventArgs.Result属性。
BackgroundWorker组件
System.ComponentModel命名空间的BackgroundWorker组件为我们提供了一个简单的多线程应用解决方案,它允许你在单独的线程上运行耗时操作而不会导致用户界面的阻塞。但是,要注意它同一时刻只能运行一个异步耗时操作(使用IsBusy属性判定),并且不能跨AppDomain边界进行封送处理(不能在多个AppDomain中执行多线程操作)。
1、BackgroundWorker组件
public class BackgroundWorker : Component
{
public BackgroundWorker();
// 获取一个值,指示应用程序是否已请求取消后台操作。
public bool CancellationPending { get; }
// 获取一个值,指示BackgroundWorker是否正在运行异步操作。
public bool IsBusy { get; }
// 获取或设置一个值,该值指示BackgroundWorker能否报告进度更新。
public bool WorkerReportsProgress { get; set; }
// 获取或设置一个值,该值指示BackgroundWorker是否支持异步取消。
public bool WorkerSupportsCancellation { get; set; }
// 调用RunWorkerAsync() 时发生。
public event DoWorkEventHandlerDoWork;
// 调用ReportProgress(System.Int32) 时发生。
public event ProgressChangedEventHandlerProgressChanged;
// 当后台操作已完成、被取消或引发异常时发生。
public event RunWorkerCompletedEventHandlerRunWorkerCompleted;
// 请求取消挂起的后台操作。
public void CancelAsync();
// 引发ProgressChanged事件。percentProgress:范围从 0% 到
public void ReportProgress(int percentProgress);
// userState:传递到RunWorkerAsync(System.Object) 的状态对象。
public void ReportProgress(int percentProgress, object userState);
// 开始执行后台操作。
public void RunWorkerAsync();
// 开始执行后台操作。argument:传递给DoWork事件的DoWorkEventArgs参数。
public void RunWorkerAsync(object argument);
}
2、相应的EventArgs类
///1) System.EventArgs基类
// System.EventArgs是包含事件数据的类的基类。
public class EventArgs
{
// 表示没有事件数据的事件。
public static readonly EventArgs Empty;
public EventArgs();
}
///2) DoWorkEventArgs类
// 为可取消的事件提供数据。
public class CancelEventArgs : EventArgs
{
public CancelEventArgs();
public CancelEventArgs(bool cancel);
// 获取或设置指示是否应取消事件的值。
public bool Cancel { get; set; }
}
// 为DoWork事件处理程序提供数据。
public class DoWorkEventArgs : CancelEventArgs
{
public DoWorkEventArgs(object argument);
// 获取表示异步操作参数的值。
public object Argument { get; }
// 获取或设置表示异步操作结果的值。
public object Result { get; set; }
}
///3) ProgressChangedEventArgs类
// 为ProgressChanged事件提供数据。
public class ProgressChangedEventArgs : EventArgs
{
public ProgressChangedEventArgs(int progressPercentage, object userState);
// 获取异步任务的进度百分比。
public int ProgressPercentage { get; }
// 获取的用户状态。
public object UserState { get; }
}
///4) RunWorkerCompletedEventArgs类
// 为MethodNameCompleted事件提供数据。
public class AsyncCompletedEventArgs : EventArgs
{
public AsyncCompletedEventArgs();
public AsyncCompletedEventArgs(Exception error, bool cancelled, object userState);
// 获取一个值,该值指示异步操作是否已被取消。
public bool Cancelled { get; }
// 获取一个值,该值指示异步操作期间发生的错误。
public Exception Error { get; }
// 获取异步任务的标识符。
public object UserState { get; }
// 访问 AsyncCompletedEventArgs 及其派生类的属性前调用此方法
protected void RaiseExceptionIfNecessary()
{
if (this.Error != null)
{
throw new TargetInvocationException(……);
}
if (this.Cancelled)
{
throw new InvalidOperationException(……);
}
}
}
public class RunWorkerCompletedEventArgs : AsyncCompletedEventArgs
{
public RunWorkerCompletedEventArgs(object result, Exception error, bool cancelled);
// 获取表示异步操作结果的值。
public object Result { get; }
// 获取表示用户状态的值。
public object UserState { get; }
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11