网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 模拟技术 >

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

时间:2022-08-19 11:16

人气:

作者:admin

标签:

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

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

Demo

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

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

poYBAGL-_rmAQnXzAAFr-wN5eyY784.png

日志输出如下:

poYBAGL-_smAYNE6AAArb7NO7WY149.png

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

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

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

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

poYBAGL-_ymAW9W8AAF1Q51U0Sw475.png

poYBAGL-_y6AOTWZAAA5LQYoYik427.png

poYBAGL-_zOAHVEEAAETOUoVOZI570.pngpYYBAGL-_zqAS42KAAEbyMxfzP8322.png
pYYBAGL-_0yAZdX5AAG4yny4GuM913.png

日志输出如下:

pYYBAGL-_12AM_2aAAA7KWQJx-M423.png

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

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

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

IAsyncResult

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

poYBAGL-_3SAWdDXAACM2tYq1QA599.png

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

pYYBAGL-_4eASnqaAABRku0vIWA696.png

自定义异步方法

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

poYBAGL-_5mAGXFKAADVN429fBk232.png

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

pYYBAGL-_6qANA47AAClHdlc9o4419.png

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

poYBAGL-_8aAaAa5AAFNs87dVXU166.png

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

pYYBAGL-_92ARluPAAD6rQPJe84712.png

运行效果如下:

pYYBAGL-__CAGHZJAAFxAYyEPY4508.png

日志输出如下:

poYBAGL_AAOAamJOAAA1XXh4sns725.png

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

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

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

普通方法的异步

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

pYYBAGL_ABmAHW8uAABIrRtICAY507.png

总结

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

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

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

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

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



审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信