async/await关键字能帮助开发者更容易地编写异步代码。但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用。本文就async/await的实质作简单描述,以便大家能更清楚理解。

一、async的实质

async的实质是告诉调用者,async标记的方法可能包含异步代码。具体来说,以wait以分界点,async标记的方法被分为三个片段:

static async void TestAsyncMethod()
{
someCode1(); //片段1
await Thask.Run(...); //片段2
comeCode3(); //片段3
}
  • 代码片段1与调用者同属一个线程,属同步代码。
  • 代码片段2表示await引起的异步代码,另起一个线程。
  • 代码片段3在await之后,表示该异步代码后的回调代码。

这3个代码片段顺序固定,但均不要求一定出现。

二、await的实质

await一定出现在async标记的代码中,表示后面挂起一段线程代码,而await异步代码后在代码均表示回调代码。代码示意如下:

await 异步代码;
回调代码;

await挂起的异步代码通常有3种情况:

  • await后调用async标记的方法
  • await Task.Run(...);
  • await Task<TResult>.Run(...);

三、代码示例

1、async中只有同步代码

代码:

        static void Main(string[] args)
{
Console.Title = "Async/Await测试";
MyAsync1();
Console.WriteLine("Test1");
Console.ReadLine();
} static async void MyAsync1()
{
Console.WriteLine("Test2");
Thread.Sleep(TimeSpan.FromSeconds());
Console.WriteLine("Test3");
}

输出结果:

Test2
Test3
Test1

2、async中含有异步代码

代码:

        static void Main(string[] args)
{
Console.Title = "Async/Await测试";
MyAsync2();
Console.WriteLine("Test1");
Console.ReadLine();
} static async void MyAsync2()
{
Console.WriteLine("Test4");
Console.WriteLine(await Task<string>.Run(() =>
{
Thread.Sleep(TimeSpan.FromSeconds());
return "Tao";
}));
Console.WriteLine("Test5");
}

输出结果:

Test4
Test1
Tao
Test5

最新文章

  1. requirejs 多页面,多js 打包代码,requirejs多对多打包【收藏】
  2. Weblogic的架构
  3. python---dnspython
  4. JUnit4使用
  5. 【探讨】javascript事件机制底层实现原理
  6. pwnable.kr-fd
  7. SQL Server DBA日常查询视图_数据库对象视图
  8. 【python】*与** 参数问题
  9. 11. Android框架和工具之 Logger(调试代码)
  10. 1833: [ZJOI2010]count 数字计数 - BZOJ
  11. 怎样配置spring aop
  12. 剑指OFFER之字符串的排列(九度OJ1369)
  13. [翻译]Python with 语句
  14. 求算符文法的FIRSTVT集的算法
  15. NTP配置实践
  16. Scala基础入门-3
  17. Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)
  18. Host和Server的开发
  19. [转]7行Python代码的人脸识别
  20. [SCOI2015]小凸玩矩阵

热门文章

  1. 避免多层回调,Node.js异步库Async使用(series)
  2. Reactor模式与观察者模式
  3. Battery-historian 参数说明
  4. Robotlegs2 学习笔记 -- SwiftSuspenders 2.x (2)
  5. 动态链接库(VC_Win32)
  6. Java中可变长参数的使用及注意事项
  7. SQL Server 数据库设计
  8. WP8_ListBox的用法
  9. Git:代码冲突常见解决方法
  10. new_things