异步CTP(Async CTP)为什么那样工作?
推断返回类型
当从异步方法返回一个值的时候,此方法体直接返回这个值,但该方法本身被声明为返回一个Task<TResult>。当声明一个返回甲类型的方法却必须返回一个乙类型时,就有点“断连”了。
// 实际语法 public async Task<int> GetValue() { await TaskEx.Delay(100); return 13; //返回类型是 "int", 而不是"Task<int>" }
问题来了:为什么我不能这么写?
// 假想语法 public async int GetValue() { await TaskEx.Delay(100); return 13; // 返回类型是 "int" }
异步返回
// 假想语法 public async Task<int> GetValue() { await TaskEx.Delay(100); async return 13; // "async return" 意味着值被包装在Task中 }
async return关键字也被考虑到了,但并没有足够的说服力。当把一些同步代码转成异步代码时,这尤其正确。强制人们给每个return语句添加asynchronous就好像是“不必要的忙碌”。比较而言,习惯于“断连”更容易。
推断“async”
async关键字必须用在使用了await关键字的方法上。然而,如果把async用在了一个没有使用await的方法上,也会收到一个警告。
问题:为什么async不能根据await的存在推断出来?
//假想语法 public Task<int> GetValue() { // "await" 的存在暗示这是一个 "async" 方法. await TaskEx.Delay(100); return 13; }
思考:向后兼容性和代码可读性
单字的await关键字具有太大的打破变化。在异步方法上的多字await(如await for)或一个关键字之间的选择,只是在那个方法内部启用await关键字。很明显,使用async标记方法让人类和计算机分析起来更容易,因此设计团队决定使用async/await对。
推断“await”
问题:既然显示包括async有意义(看上面),为什么await不能根据async的存在推断出来呢?
// 假想语法 public async Task<int> GetValue() { // 暗示有"await",因为这是一个 "async" 方法. TaskEx.Delay(100); return 13; }
思考:异步操作的并行组合。
乍一看,推断await推断似乎简化了基本的异步操作。只要所有的等待可以按序列(如一个操作等待,然后另一个,再然后另一个)完成,这个就能很好的工作。然而,当有人考虑并行组合的时候,它崩溃了。
异步CTP中的并行组合使用TaskEx.WhenAny 和TaskEx.WhenAll方法。这有一个简单的例子,这个方法立即开始了两个操作,并且等待它们完成。
// 实际语法 public async Task<int> GetValue() { // 异步检索两个部分的值 // 注意此时它们是没有等待的“not await” Task<int> part1 = GetValuePart1(); Task<int> part2 = GetValuePart2(); // 等待它们的值到达。 await TaskEx.WhenAll(part1, part2); // 计算我们的结果 int value1 = await part1; // 实际上没有等待 int value2 = await part2; //实际上没有等待 return value1 + value2; }
为了处理并行组合,我们必须有能力说我们将不会await一个表达式。
已将所有赞助者统一放到单独页面!签名处只保留最近10条赞助记录!查看赞助者列表
衷心感谢打赏者的厚爱与支持!也感谢点赞和评论的园友的支持! | |||
---|---|---|---|
打赏者 | 打赏金额 | 打赏日期 | |
微信:匿名 | 10.00 | 2017-08-03 | |
微信:匿名 | 10.00 | 2017-08-04 | |
微信:匿名 | 5.00 | 2017-06-15 | |
支付宝:一个名字499***@qq.com | 5.00 | 2017-06-14 | |
微信:匿名 | 16.00 | 2017-04-08 | |
支付宝:向京刘 | 10.00 | 2017-04-13 | |
微信:匿名 | 10.00 | 2017-003-08 | |
微信:匿名 | 5.00 | 2017-03-08 | |
支付宝:lll20001155 | 5.00 | 2017-03-03 | |
支付宝:她是一个弱女子 | 5.00 | 2017-03-02 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)