基于IAsyncResult的APM模型实现异步操作

描述

 

在 C#1 的时候就包含了APM,在 APM 模型中,异步操作通过 IAsyncResult 接口实现,包括两个方法 BeginOperationName 和 EndOperationName ,分别表示开始和结束异步操作。

Demo

我们先来看一个同步示例。新建WPF程序,在界面上放一个按钮。点击按钮访问外网,会有一定时间的阻塞。
回调函数

当我们点击按钮后,因为web请求是同步的,会阻塞UI线程一定时间。从输出日志上看阻塞时间是 1 秒钟左右,此时界面呈卡死状态。

回调函数

日志输出如下:

回调函数

从运行效果和日志,我们可以看出:

• WebRequest方法调用前后都是在同一个线程上执行-UI线程

• WebReqeust方法阻塞了UI线程,导致“假死”现象

WebRequest也提供了异步方法,BeginGetResponse,EndGetResponse。我们修改一下代码,新增一个按钮。

回调函数

回调函数

回调函数回调函数
回调函数

日志输出如下:

回调函数

从运行效果和日志,我们可以看出:

• 异步方法不会阻塞调用方法,调用后立刻返回

• 异步方法会在另外一个线程上执行

IAsyncResult

BeginOperationName 方法会返回一个实现了 IAsyncResult 接口的对象。该对象存储了关于异步操作的信息。

回调函数

转到定义,我们可以看到接口中都包含哪些内容:

回调函数

自定义异步方法

实现该接口,定义自己的异步方法。

回调函数

我们需要新建一个回调函数:

回调函数

在这之后就可以自定义 APM 异步模型了:

回调函数

新增一个按钮,进行调用:

回调函数

运行效果如下:

回调函数

日志输出如下:

回调函数

结合效果和日志,我们可以得出如下结论:

• 自定义的异步方法没有导致 UI 卡顿

• APM就是把耗时的任务交给新线程去做,然后利用委托进行回调

普通方法的异步

如果是普通方法,也可以通过 委托异步(BeginInvoke, EndInvoke):

回调函数

总结

1. APM 模型是基于IAsyncResult来实现异步操作的

2. 异步操作开始时,把委托传递给 IAsyncResult

3. 在新线程上执行耗时操作

4. 耗时操作结束后,修改 IAsyncResult 里的结果数据,并调用 IAsyncResult 里的委托回调

5. 在回调里获取 异步操作 的结果



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分