当前位置: 首页 > news >正文

异步CTP(Async CTP)为什么那样工作?

对异步CTP感兴趣有很多原因。异步CTP使异步编程比以前更加容易了。它虽然没有Rx强大,但是更容易学。异步CTP介绍了两个新的关键字,async和await。异步方法(或Lambda表达式)必须返回void,Task或Task<TResult>。这篇文章不是介绍异步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"
}
复制代码

 

思考:该方法如何如何照顾调用者呢?异步方法必须返回一个实际结果类型Task<TResult>的值。因此,GetValue方法会出现返回Task<TResult>的智能提示(在对象浏览器,Reflector等中也是这样的)。
 
在设计之初,推断返回类型已经被考虑到了,但该设计团队已经推断出在异步方法中保持这种“断连”比在代码基上扩大这种“断连”更好。如今这种“断连”仍存在,但比以前更小了。该设计团队的共识是一致的方法签名更佳。
思考:async void 和async Task有什么区别?
一个async Task方法就像任何其他的异步操作一样,只是没有返回值。一个async void方法扮演一种高级操作。async Task方法可能被组合进其他使用using await的异步方法。async void方法可能被用作一个事件句柄。async void方法也有其他重要的属性:在ASP.NET上下文中,它通知web服务器直到它返回,页面才完成。
 
推断返回类型会移除async void 和async Task间的区别:要么所有的异步方法是async void(阻止可组合性),要么都是async Task(阻止它们来自事件句柄,同时对ASP.NET要有一个可选择的方案)。

 异步返回

 
在方法声明返回类型和方法体返回的类型之间仍有“断连”。该设计团队的另一个建议是:给return添加一个关键字来指示return返回的值,但这个也确实没有返回什么,如下所示:
复制代码
// 假想语法
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一个表达式。




本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/4840524.html,如需转载请自行联系原作者

相关文章:

  • 把python文件编译成exe文件
  • ArcGis Mobile根据查询出来的坐标画marker(DrawMapImage)
  • 什么是Heartbeat
  • hdu 4027 Can you answer these queries?
  • Windows数据类型探幽——千回百转你是谁?(1)
  • 数据库连接错误: The provider did not return a ProviderManifestToken string.
  • C#编写的winform程序打包方法
  • 2017.11.14 小组第二次例会
  • 032 文本框中的时间格式
  • hdu 4012 Paint on a Wall
  • Android开发者指南(11) —— Optimizing Apps for Android 3.0
  • C#获取当前路径的7种方法
  • android116 轮播 viewPager实现
  • 参加虚拟化达人训练营的体会
  • 转载: 关于ruby中 %Q, %q, %W, %w, %x, %r, %s 的用法
  • [译]前端离线指南(上)
  • 0x05 Python数据分析,Anaconda八斩刀
  • CSS实用技巧干货
  • es6(二):字符串的扩展
  • HTML中设置input等文本框为不可操作
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript学习总结——原型
  • Linux下的乱码问题
  • SpringBoot几种定时任务的实现方式
  • V4L2视频输入框架概述
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 翻译:Hystrix - How To Use
  • 反思总结然后整装待发
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 首页查询功能的一次实现过程
  • 算法-图和图算法
  • 线上 python http server profile 实践
  • 用jquery写贪吃蛇
  • ​configparser --- 配置文件解析器​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #Java第九次作业--输入输出流和文件操作
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (4)(4.6) Triducer
  • (二十三)Flask之高频面试点
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)C#调用WebService 基础
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 提取注释生成API文档 帮助文档
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net开发引用程序集提示没有强名称的解决办法
  • .Net中wcf服务生成及调用
  • :中兴通讯为何成功
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [ASP]青辰网络考试管理系统NES X3.5
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]