C# 将 Begin 和 End 异步方法转 task 异步
在 .NET Framework 有两个不同的异步方法,一个是 Asynchronous Programming Model (APM) 另一个是 Task-based asynchronous pattern (TAP) 说 APM 和 TAP 估计大家都不认识。其实 APM 就是有成对的 Begin 和 End 方法的异步,而 TAP 就是使用 async 和 await 的异步
从代码上看,使用 async 和 await 的方法比较清真,那么如何从古老的 begin 和 end 异步方法转 task 的异步方法?
在 Task 的 Factory 提供了 FromAsync 方法让大家可以将 Begin 和 End 异步方法转 task 异步,但是这个方法参数很多
在 Begin 的方法里面一般都是这样写的
IAsyncResult BeginFoo(参数 参数1, 参数 参数2..., AsyncCallback asyncCallback, object state)
在 End 的方法一般都是这样写的
返回值 EndFoo (IAsyncResult asyncResult);
先调用 Begin 方法传入参数,拿到了 IAsyncResult 用于传入 EndFoo 作为参数,同时在 AsyncCallback 可以传入方法完成的方法
在 FromAsync 写起来是相反的,首先需要知道 End 方法的返回值,下面使用 FileStream 作为例子,如 EndRead 是返回 int 可以使用 Task<int>
的方法
Task<int>.Factory.FromAsync
这样就可以拿到 EndRead 的返回值
在 FromAsync 的第一个参数传入的是 BeginRead 方法,第二个参数是 EndRead 方法,然后加上的 BeginRead 方法需要传入的参数,传入除了 AsyncCallback 之外的其他参数,请看下面代码
var task = Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, 1024, null);
也就是有 IAsyncResult BeginFoo(参数 参数1, 参数 参数2..., AsyncCallback asyncCallback, object state)
这个方法,那么在转 async 和 await 异步,可以使用下面代码
Task<返回值参数>.Factory.FromAsync(foo.BeginFoo, foo.EndFoo, 参数1, 参数2 ..., state)
C# 中 async/await 调用传统 Begin/End 异步方法 - dudu - 博客园
Asynchronous Programming Model (APM)
Task-based Asynchronous Pattern (TAP)
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
相关文章
- C# String 前面不足位数补零的方法
- (c#) 销毁资源和释放内存
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- c# net , layui文件上传,手写-普通文件上传,上传并添加水印,上传并生成缩略图,上传并删除指定文件,
- C#扩展方法
- C#【文件操作篇】一种提高C#实时存储excel文件速度的方法
- C#【通用方法】写入错误日志的方法
- C#,递归方法实现双向链表(Doubly Linked List)的反转(Reverse)算法与源代码
- C#中异步窗体的调用的几种方法
- C#中如何复制窗体到另一个项目
- c# 拼接Json串的几种方法
- C#中OpenFileDialog获取文件名和文件路径的常用方法.
- c#-接口
- C# 坦克游戏大战中学习相关类(Rectangle)
- C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
- .Net CCNet C#6.0 自动化编译问题解决
- c# System.Enum的方法
- 一种非常巧妙的读取串口数据的方法--C#
- C#字符串相关方法与字符数组的转换
- C# 预处理器指令
- 改善C#程序的建议2:C#中dynamic的正确用法
- java 调用 C# webapi
- C# 获取所有对象的字符串表示一ToString方法
- C# 字符串操作基本过程(Equals、Compare、EndsWith等处理方法)
- C# 终极基类Object介绍
- C#-Linq-使用Linq实现SQL的全连接
- C#中错误日志记录方法,信息比较详细易定位
- C#内存释放(垃圾回收)
- C#-事件的理解以及自定义事件的方法
- C# 监测每个方法的执行次数和占用时间(测试2)