当前位置:网站首页>深入理解C#中的异步(一)——APM模式EAP模式

深入理解C#中的异步(一)——APM模式EAP模式

2020-12-08 01:05:49 程序猿欧文

深入理解C#中的异步(一)——APM模式EAP模式

目录
  • 深入理解C#中的异步(一)——APM模式EAP模式
    • 1 使用异步编程的原因
    • 2 异步编程模式
      • 2.1 APM模式
        • 2.1.1 APM模式示例代码
        • 2.1.2 执行结果
        • 2.1.3 APM回调例子
        • 2.1.4 执行结果
      • 2.2 EAP模式
        • 2.2.1 EAP模式编程示例1
        • 2.2.2 执行结果
        • 2.2.3 封装一个EAP例子
        • 2.2.4 执行结果
    • 3 代码仓库
    • 4 下篇

1 使用异步编程的原因

同步编程,服务器在响A服务的数据库读取,网页请求或者文件请求(这里我们统称为IO操作),如果延迟很大,此时如果来了B服务的IO请求,可能无法及时响应(阻塞),此时异步编程模式(非阻塞)应运而生。

异步编程模式是为了避免性能瓶颈并增强你的应用程序的总体响应能力。

2 异步编程模式

2.1 APM模式

APM(Asynchronous Programming Model) 是 net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法.

2.1.1 APM模式示例代码

 class Program {  static void Main(string[] args)  {   Console.WriteLine("===== 异步调用 AsyncInvokeTest =====");   WebResponseHandler handler = new WebResponseHandler(WebContentLength.GetResult);   //IAsyncResult: 异步操作接口(interface)   //BeginInvoke: 委托(delegate)的一个异步方法的开始   IAsyncResult result = handler.BeginInvoke( null, null);   Console.WriteLine("继续做别的事情。");   //异步操作返回   Console.WriteLine(handler.EndInvoke(result));   Console.ReadKey();  } } public delegate string WebResponseHandler(); public class WebContentLength {  public static string GetResult()  {   var client = new WebClient();   var content = client.DownloadString(new Uri("http://cnblogs.com"));   return "网页字数统计:"+content.Length;  } }

2.1.2 执行结果

备注:APM又是建立在委托之上的。Net Core中的委托 不支持异步调用,也就是 BeginInvoke 和 EndInvoke 方法,即现代异步编程模型中,官方不推荐此模型。此例子使用 .Net FrameWork4.7框架。

2.1.3 APM回调例子

当异步请求响应完成之后,会自动去调用回调方法,将网页字数统计结果打印。

 class Program {  static void Main(string[] args)  {   Console.WriteLine("===== 异步回调 AsyncInvokeTest =====");   WebResponseHandler handler = new WebResponseHandler(WebContentLength.GetResult);   //异步操作接口(注意BeginInvoke方法的不同!)   IAsyncResult result = handler.BeginInvoke( new AsyncCallback(CalllBack), "AsycState:OK");   Console.WriteLine("继续做别的事情。");   Console.ReadKey();  }  static void CalllBack(IAsyncResult result)  {   WebResponseHandler handler = (WebResponseHandler)((AsyncResult)result).AsyncDelegate;   Console.WriteLine(handler.EndInvoke(result));   Console.WriteLine(result.AsyncState);  } } public delegate string WebResponseHandler(); public class WebContentLength {  public static string GetResult()  {   var client = new WebClient();   var content = client.DownloadString(new Uri("http://cnblogs.com"));   return "网页字数统计:" + content.Length;  } }

备注:可以看出此种回调方式与人的思维逻辑相违背,当在回调函数中存在二级三级回调时,代码可读性变差,编程会变得比平常要困难一些。

2.1.4 执行结果

2.2 EAP模式

EAP(Event-based Asynchronous Pattern)基于事件的异步模式是 .net 2.0提出的,EAP异步编程算是C#对APM的一种补充,让异步编程拥有了一系列状态事件。实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP。

当我们使用EAP模式进行异步编程时,需要满足以下2个条件:

  1. 要进行异步的方法其方法名应该以XXXAsync结尾
  2. 要有一个名为XXXCompleted的事件监听异步方法的完成
  3. 可增加一个CancelAsync方法用于取消正在执行的异步方法(可选)

备注:当调用基于事件的EAP模式的类的XXXAsync方法时,就开始了一个异步操作,并且基于事件的EAP模式是基于APM模式之上的。EAP 是在 .NET Framework 2.0 版中引入的,在 winform,silverlight或者wpf变成中经常用到。

版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4780271