2019-8-31-C#-将-Begin-和-End-异步方法转-task-异步
title | author | date | CreateTime | categories |
---|---|---|---|---|
C# 将 Begin 和 End 异步方法转 task 异步
|
lindexi
|
2019-08-31 16:55:58 +0800
|
2019-05-15 14:13:35 +0800
|
C#
|
在 .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 - 博客园
2019-8-31-C#-将-Begin-和-End-异步方法转-task-异步的更多相关文章
- C# 将 Begin 和 End 异步方法转 task 异步
在 .NET Framework 有两个不同的异步方法,一个是 Asynchronous Programming Model (APM) 另一个是 Task-based asynchronous pa ...
- agentzh 的 Nginx 教程(版本 2019.07.31)
agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...
- ARTS Challenge- Week 1 (2019.03.25~2019.03.31)
1.Algorithm - at least one leetcode problem per week(Medium+) 986. Interval List Intersections https ...
- 2020届京东秋招正式批一面记录-Java开发-2019.08.31
京东一面总结 总共时间持续时间约40分钟 1.你用过集合类里面哪些是线程安全的,哪些是线程不安全的?分别举两个例子? 线程安全:HashTable以及ConcurrentHashMap 非线程安全:A ...
- 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31
比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...
- Beta冲刺(9/7)——2019.5.31
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...
- lyc——2019.10.31
10:判决素数个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y). 输入 两个整数X和Y(1 <= X,Y <= ...
- 【Python可视化】超详细Pyecharts 1.x教程,让你的图表动起来~
前言 pyecharts 是一个用于生成 Echarts 图表的Python库.Echarts是百度开源的一个数据可视化 JS 库,可以生成一些非常酷炫的图表. Pyecharts在1.x版本之后迎来 ...
- 小白学 Python 数据分析(21):pyecharts 好玩的图表(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
随机推荐
- localStorage对象简单应用 - - 访问次数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 直接在安装了redis的Linux机器上操作redis数据存储类型--set类型
一.概述: 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复 ...
- MySQL数据库起步 关于数据库的基本操作(更新中...)
mysql的基本操作 连接指定的服务器(需要服务器开启3306端口) mysql -h ip地址 -P 端口号 -u 账号 -p 密码 删除游客模式 mysql -h ip地址 -P 端口号 -u 账 ...
- java 5 绘图GUI
---恢复内容开始--- 绘图的基本原理 color 在awt包里面 字体的相关类 Graphics类常用方法 JFrame 继承JFrame就有主窗口了 Java2D API 绘图的例子 了解Swi ...
- 【洛谷P1207】双重回文数 【USACO1.2】
P1207 [USACO1.2]双重回文数 Dual Palindromes 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一 ...
- 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储。
https://github.com/kcloze/swoole-jobs 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储.参考资料:swoole https:/ ...
- 7. 18 test 砍树题解
(题面保密,内部人员可览) 首先观察题面,可得出如下公式 ∑(ceil(a[i] /d)*d−a[i])≤k 其中,ceil(a[i] /d)表示在需要被砍伐之前所经过的轮数,ceil函数是为了保证一 ...
- 【JZOJ4711】【NOIP2016提高A组模拟8.17】Binary
题目描述 输入 输出 样例输入 6 6 8 9 1 13 9 3 1 4 5 2 6 9 1 3 7 2 7 7 1 6 1 2 11 13 样例输出 45 19 21 数据范围 解法 40%暴力即可 ...
- DIV元素垂直居中的分析与实现
首先,对于需要垂直居中的元素常规居中处理 margin: 0 auto; 接下来要设置div的祖先元素的宽高为100%, 在默认的设置中他们都为0: html, body { width: %; he ...
- DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES
原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010 ...