可以对任何提供 GetAwaiter 方法并返回 awaiter 的对象使用 async 关键字。awaiter 用 OnCompleted 方法实现 INotifyCompletion 接口。此方法在任务完成时调用。下面的代码片段不是在任务中使用 await,而是使用任务的 GetAwaiter 方法。Task 类的 GetAwaiter 返回一个 TaskAwaiter。使用 OnCompleted 方法,分配一个在任务完成时调用的本地函数:

private static void CallerWithAwaiter()
{TraceThreadAndTask($"starting {nameof(CallerWithAwaiter)}");TaskAwaiter<string> awaiter = GreetingAsync("Matthias").GetAwaiter();awaiter.OnCompleted(OnCompleteAwaiter);void OnCompleteAwaiter(){Console.WriteLine(awaiter.GetResult());TraceThreadAndTask($"ended {nameof(CallerWithAwaiter)}");}
}

运行应用程序时,结果类似于你使用 wait 关键字的情形:

starting CallerWithAwaiter in thread 2 and no task
running GreetingAsync in thread 3 and task 1
running Greeting in thread 3 and task 1
Hello,Matthias
ended CallerWithAwaiter in thread 3 and no task

编译器把 await 关键字后的所有代码放进 OnCompleted 方法的代码块中来转换 await 关键字。

C# 使用Awaiter相关推荐

  1. C# 5.0中引入了async 和 await

    C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: [csharp] view plaincopy public class MyClass { p ...

  2. C# Task 循环任务_理解C#中的ValueTask

    英文:devblogs.microsoft.com 译文:cnblogs.com/xiaoxiaotank/p/13206569.html 译者:xiaoxiaotank 前言 Task类是在.NET ...

  3. 为所有服务器端代码调用ConfigureAwait的最佳实践

    本文翻译自:Best practice to call ConfigureAwait for all server-side code When you have server-side code ( ...

  4. async/await 的基本实现和 .NET Core 2.1 中相关性能提升

    前言 这篇文章的开头,笔者想多说两句,不过也是为了以后再也不多嘴这样的话. 在日常工作中,笔者接触得最多的开发工作仍然是在 .NET Core 平台上,当然因为团队领导的开放性和团队风格的多样性(这和 ...

  5. 关于Async与Await的FAQ

    =============C#.Net 篇目录============== 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰 ...

  6. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  7. 14.并发与异步 - 2.任务Task -《果壳中的c#》

    线程是创建并发的底层工具,因此具有一定的局限性. 没有简单的方法可以从联合(Join)线程得到"返回值".因此必须创建一些共享域.当抛出一个异常时,捕捉和处理异常也是麻烦的. 线程 ...

  8. 15.5.2 【Task实现细节】骨架方法的结构

    尽管骨架方法中的代码非常简单,但它暗示了状态机的职责.代码清单15-11生成的骨架方 法如下所示: 1 [DebuggerStepThrough] 2 [AsyncStateMachine(typeo ...

  9. 浅谈async、await关键字 = 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

最新文章

  1. 创业记——个人电脑、服务器选型
  2. 为什么redis取出来是null_跳表:为什么Redis一定要用跳表来实现有序集合
  3. iccar conference oral presentation
  4. 泛型算法STL中的迭代器,泛型算法,萃取机的一个实现案例
  5. SQL:REGEXP
  6. 在线视频常见加密方式及安全性透析
  7. react学习(27)---antdesign设置默认值
  8. Apollo进阶课程 ⑮丨Apollo自动定位技术详解—百度无人车定位技术
  9. MySQL进阶路:从小工到专家的必读书籍和必备工具
  10. Atitit 语义网的实现技术 目录 1. 语义网概念及技术综述 1 2. 图2-1 语义网的体系结构 2 2.1. 第1层:基础层,主要包含Unicode和URI(Uniform resource
  11. linux下分析prn文件,linux专题一之文件描述符、重定向、管道符、tee命令
  12. java生成pdf417条形码_python生成417条形码(PDF417)
  13. 使用electron开发了一个excel对比工具
  14. 【postgres】postgres 数据库迁移
  15. IC基础知识3-输入阻抗和输出阻抗
  16. python字符串结束的标志_python-7-字符串的操作_方法_format_列表的操作
  17. 【代理知识】绝对值得珍藏!(转)
  18. vscode中切换远程分支
  19. 下载webStorm,nodejs,git并简单配置,为JavaScript做准备
  20. Linux脚本的制作命令

热门文章

  1. Python操作Excel——win32com模块和xlrd+xlwt+xlutils组合
  2. Windows7下注册OCX的注意事项
  3. python pack unpack_golang 仿python pack/unpack
  4. CentOS系统更换yum源(repomd.xml not found解决方案)
  5. jQuery之Ajax
  6. Spring boot整合Mongodb
  7. JSON 解析的两种方法
  8. 面向对象——概念(成员变量、静态变量、成员方法、静态方法、垃圾回收机制、重载、包)...
  9. 02 JRE与JDK
  10. [原] XAF How to implement a custom attribute to customize the Application Model