注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

异步编程:基于事件的异步编程模式(EMP)  

2013-08-09 17:21:27|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

传送门:异步编程系列目录……

上一篇,我给大家介绍了“.NET1.0 IAsyncResult异步编程模型(APM)”,通过Begin*** 开启操作并返回IAsyncResult对象,使用 End*** 方法来结束操作,通过回调方法来做异步操作后其它事项。然而最大的问题是没有提供进度通知等功能及多线程间控件的访问。为克服这个问题(并解决其他一些问题),.NET2.0 中引入了基于事件的异步编程模式(EMP)。通过事件、AsyncOperationManager类和AsyncOperation类两个帮助器类实现如下功能:

1)   异步执行耗时的任务。

2)   获得进度报告和增量结果。

3)   支持耗时任务的取消。

4)   获得任务的结果值或异常信息。

5)   更复杂:支持同时执行多个异步操作、进度报告、增量结果、取消操作、返回结果值或异常信息。

对于相对简单的多线程应用程序,BackgroundWorker组件提供了一个简单的解决方案。对于更复杂的异步应用程序,可以考虑实现一个符合基于事件的异步模式的类。

 

 

 

源码下载:异步编程:基于事件的异步模型(EAP).rar

 

EAP异步编程模型的优点

    EAP是为Windows窗体开发人员创建的,其主要优点在于:

1.   EAPMicrosoft Visual Studio UI设计器进行了很好的集成。也就是说,可将大多数实现了EAP的类拖放到一个Visual Studio设计器平面上,然后双击事件名,让Visual Studio自动生成事件回调方法,并将方法同事件关联起来。

2.   EAP类在内部通过SynchronizationContext类,将应用程序模型映射到合适线程处理模型,以方便跨线程操作控件。

 

为了实现基于事件的异步模式,我们必须先理解两个重要的帮助器类:

 

AsyncOperationManagerAsyncOperation

    AsyncOperationManager类和AsyncOperation类是System.ComponentModel命名空间为我们提供了两个重要帮助器类。在基于事件的异步模式封装标准化的异步功能中,它确保你的异步操作支持在各种应用程序模型(包括 ASP.NET、控制台应用程序和 Windows 窗体应用程序)的适当“线程或上下文”调用客户端事件处理程序。

AsyncOperationManager类和AsyncOperation类的API如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 为支持异步方法调用的类提供并发管理。此类不能被继承。
public static class AsyncOperationManager
{
    // 获取或设置用于异步操作的同步上下文。
    public static SynchronizationContext SynchronizationContext { get; set; }
 
    // 返回可用于对特定异步操作的持续时间进行跟踪的AsyncOperation对象。
    // 参数:userSuppliedState:
    //     一个对象,用于使一个客户端状态(如任务 ID)与一个特定异步操作相关联。
    public static AsyncOperation CreateOperation(object userSuppliedState)
    {
        return AsyncOperation.CreateOperation(userSuppliedState,SynchronizationContext);
    }
}
 
// 跟踪异步操作的生存期。
public sealed class AsyncOperation
{
    // 构造函数
    private AsyncOperation(object userSuppliedState, SynchronizationContext syncContext);
    internal static AsyncOperation CreateOperation(object userSuppliedState
                                            , SynchronizationContext syncContext);
 
    // 获取传递给构造函数的SynchronizationContext对象。
    public SynchronizationContext SynchronizationContext { get; }
    // 获取或设置用于唯一标识异步操作的对象。
    public object UserSuppliedState { get; }
 
    // 在各种应用程序模型适合的线程或上下文中调用委托。
    public void Post(SendOrPostCallback d, object arg);
    // 结束异步操作的生存期。
    public void OperationCompleted();
    // 效果同调用 Post() + OperationCompleted() 方法组合
    public void PostOperationCompleted(SendOrPostCallback d, object arg);
}

 

 转自:http://www.cnblogs.com/heyuquan/archive/2013/04/26/3045827.html

  评论这张
 
阅读(503)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017