Async_Await;
async关键字只是激活了await关键字,在遇到“await”关键字方法都是同步运行的。await 表达式表示可等待是一个异步操作点,在该点上,直到等待的异步操作完成方法才能继续(返回之前的“上下文”中执行),然后从异步方法返回。 在该点同时,将方法挂起,并且返回一个对象到方法的调用方!
示例:原文(PS 我学习都是照着msdn文档打一遍的):https://msdn.microsoft.com/zh-cn/library/hh873191(v=vs.120).aspx
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows; 7 using System.Windows.Controls; 8 using System.Windows.Data; 9 using System.Windows.Documents; 10 using System.Windows.Input; 11 using System.Windows.Media; 12 using System.Windows.Media.Imaging; 13 using System.Windows.Navigation; 14 using System.Windows.Shapes; 15 16 // Add a using directive and a reference for System.Net.Http; 17 using System.Net.Http; 18 19 namespace AsyncTracer 20 { 21 public partial class MainWindow : Window 22 { 23 public MainWindow() 24 { 25 InitializeComponent(); 26 } 27 28 private async void startButton_Click(object sender, RoutedEventArgs e) 29 { 30 // The display lines in the example lead you through the control shifts. 31 resultsTextBox.Text += "ONE: Entering startButton_Click.\r\n" + 32 " Calling AccessTheWebAsync.\r\n"; 33 34 Task<int> getLengthTask = AccessTheWebAsync(); 35 36 resultsTextBox.Text += "\r\nFOUR: Back in startButton_Click.\r\n" + 37 " Task getLengthTask is started.\r\n" + 38 " About to await getLengthTask -- no caller to return to.\r\n"; 39 40 int contentLength = await getLengthTask; 41 42 resultsTextBox.Text += "\r\nSIX: Back in startButton_Click.\r\n" + 43 " Task getLengthTask is finished.\r\n" + 44 " Result from AccessTheWebAsync is stored in contentLength.\r\n" + 45 " About to display contentLength and exit.\r\n"; 46 47 resultsTextBox.Text += 48 String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength); 49 } 50 51 52 async Task<int> AccessTheWebAsync() 53 { 54 resultsTextBox.Text += "\r\nTWO: Entering AccessTheWebAsync."; 55 56 // Declare an HttpClient object. 57 HttpClient client = new HttpClient(); 58 59 resultsTextBox.Text += "\r\n Calling HttpClient.GetStringAsync.\r\n"; 60 61 // GetStringAsync returns a Task<string>. 62 Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); 63 //如果不需要显示这些文字,上面就可以直接await;await会阻塞本方法; 64 resultsTextBox.Text += "\r\nTHREE: Back in AccessTheWebAsync.\r\n" + 65 " Task getStringTask is started."; 66 67 // AccessTheWebAsync can continue to work until getStringTask is awaited.No await No asynchronous; 68 69 resultsTextBox.Text += 70 "\r\n About to await getStringTask and return a Task<int> to startButton_Click.\r\n"; 71 72 // Retrieve the website contents when task is complete. 73 string urlContents = await getStringTask; 74 75 resultsTextBox.Text += "\r\nFIVE: Back in AccessTheWebAsync." + 76 "\r\n Task getStringTask is complete." + 77 "\r\n Processing the return statement." + 78 "\r\n Exiting from AccessTheWebAsync.\r\n"; 79 80 return urlContents.Length; 81 } 82 } 83 }
执行结果:
ONE: Entering startButton_Click.Calling AccessTheWebAsync.TWO: Entering AccessTheWebAsync.Calling HttpClient.GetStringAsync.THREE: Back in AccessTheWebAsync.Task getStringTask is started.About to await getStringTask & return a Task<int> to startButton_Click.FOUR: Back in startButton_Click.Task getLengthTask is started.About to await getLengthTask -- no caller to return to.FIVE: Back in AccessTheWebAsync.Task getStringTask is complete.Processing the return statement.Exiting from AccessTheWebAsync.SIX: Back in startButton_Click.Task getLengthTask is finished.Result from AccessTheWebAsync is stored in contentLength.About to display contentLength and exit.Length of the downloaded string: 33946.
跟踪程序:
AccessTheWebAsync 和 client.GetStringAsync 的返回类型是 Task。 对于 AccessTheWebAsync,TResult 是整数。 对于GetStringAsync,TResult 是字符串。所以说await异步等待的方法跟此方法返回的类型可以不同; 当控件转换回调用方时,任务返回的异步方法返回任务实例。 当调用方法中出现 Await 或 await 运算符,或当调用方法结束时,控件从异步方法返回其调用方。
步骤三:
在 AccessTheWebAsync 中,调用异步方法 GetStringAsync(String) 可下载目标网页的内容。 控件从 client.GetStringAsync 返回到AccessTheWebAsync,当 client.GetStringAsync 返回。
client.GetStringAsync 方法返回分配给 AccessTheWebAsync 中 getStringTask 变量的字符串的任务。
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
您可以将任务视为 client.GetStringAsync 做出的承诺,以便最终生成一个实际字符串。 同时,如果 AccessTheWebAsync 要执行不依赖client.GetStringAsync 承诺的字符串的工作(也是下面的代码如果跟client.GetStringAsync返回的结果无关,不必await等待,执行完再await),则该工作在 client.GetStringAsync 等待时继续。 在示例中,以下输出行(标记为“THREE”)表示可以单独操作。
THREE: Back in AccessTheWebAsync.Task getStringTask is started.About to await getStringTask & return a Task<int> to startButton_Click.
当等待 getStringTask 时,下面的语句会挂起 AccessTheWebAsync 中的进程。调用方继续执行,直至遇到await;
string urlContents = await getStringTask;
下图显示了从 client.GetStringAsync 到 getStringTask 的分配和从 getStringTask 的创建到等待运算符的应用程序的控制流。
重点:等待表达式挂起 AccessTheWebAsync 直到 client.GetStringAsync 返回。 同时,控件返回至 AccessTheWebAsync、startButton_Click 的调用方。
步骤四:
Task<int> getLengthTask = AccessTheWebAsync();
正如在 AccessTheWebAsync 中,startButton_Click 可继续那些不依赖于异步任务结果的工作 (getLengthTask) 直到任务处于等待状态。 下面的输出行表示该工作。
FOUR: Back in startButton_Click.Task getLengthTask is started.About to await getLengthTask -- no caller to return to.
当 getLengthTask 等待时,startButton_Click 中的进程将被挂起。 下面的赋值语句会挂起 startButton_Click 直到 AccessTheWebAsync 完成。
int contentLength = await getLengthTask;
在下图中,箭头显示从 AccessTheWebAsync 中的 await 表达式到赋值给 getLengthTask 的控制流,接着是在 startButton_Click 中进行一般处理,直到等待 getLengthTask。
步骤五:
如果 client.GetStringAsync 发出了已完成信号,AccessTheWebAsync 中的处理过程就可以从挂起中释放并继续到 await 语句后。 输出的以下行表示处理的恢复。
FIVE: Back in AccessTheWebAsync.Task getStringTask is complete.Processing the return statement.Exiting from AccessTheWebAsync.
返回语句 urlContents.Length 的操作存储在 AccessTheWebAsync 返回的任务中。 等待表达式从 startButton_Click 中的 getLengthTask 检索该值。
下图显示 client.GetStringAsync(和 getStringTask)完成后的控件传输。
如果 AccessTheWebAsync 发出了已完成信号,处理过程就可以继续到 startButton_Async中的 await 语句后。 实际上,程序没有其他要执行的操作。
输出的以下行表示 startButton_Async 中处理的恢复:
SIX: Back in startButton_Click.Task getLengthTask is finished.Result from AccessTheWebAsync is stored in contentLength.About to display contentLength and exit.
等待表达式是从作为 AccessTheWebAsync 中返回语句的操作数的 getLengthTask 整数值中检索的。 下面的语句将该值分配给 contentLength变量。
int contentLength = await getLengthTask;
下图显示了从 AccessTheWebAsync 到 startButton_Click 的控制返回。
转载于:https://www.cnblogs.com/entclark/p/8232931.html
Async_Await;相关推荐
- python协程框架_[记录]python的简单协程框架(回调+时间循环+select)
# -*- coding: utf-8 -*- # @Time : 2018/12/15 18:55 # @File : coroutine.py #一个简单的 Coroutine 框架 import ...
- Atitit.异步的实现模式attilax大总结
Atitit.异步的实现模式attilax大总结 1.1. 函数回调(包括的future模式)1 1.2. 事件机制( 包括定时器 listeners 1 1.3. 中断机制1 1.4. 订阅机制 发 ...
- 【转】2.2[译]async/await中阻塞死锁
这篇博文主要是讲解在async/await中使用阻塞式代码导致死锁的问题,以及如何避免出现这种死锁.内容主要是从作者Stephen Cleary的两篇博文中翻译过来. 原文1:Don'tBlock o ...
- ES6——generator与yield
文章目录 一.Generator生成器函数 1. 特点 2. 关联概念 二.yield的加入 1. 引入 2. yield 特点 三.举个例子 一.Generator生成器函数 它是ES6新推出的一种 ...
- 【ES】1318- 这些 ES7-ES12 的知识点你都掌握了吗?
听说现在大家在工作中ES6语法都已经用的炉火纯青了,那ES7-ES12的新特性你现在都用上了嘛?很多的新特性在开发中还是很实用的,也解决了很多js存在的问题.自己熬夜爆肝一个周末, 总结出了ES7-E ...
- 【Rust日报】 2019-08-12:Tokio alpha 版发布,新版本支持async/await
Tokio alpha 版发布 #tokio 新版本支持async/await tokio = "=0.2.0-alpha.1" #![feature(async_await)]u ...
- 【Rust日报】 2019-08-01:brpc-rs - X-lab 实验室新推出的一个rpc库
paperclip - OpenAPI 规范的 Rust 实现 在完成后,它会实现: Rust 中的服务器端.客户端和命令行端的高效的.编译时检查的.类型安全的 HTTP API 的生成: 支持处理. ...
- Node.js Postgres 教程
Node Postgres教程展示了如何在JavaScript中使用Node-postgres的PostgreSQL数据库. The node-postgres node-postgres是Node. ...
最新文章
- 稳健地估计单应性矩阵,需要几个特征点?
- hadoop fs默认操作路径
- 【java开发系列】—— 集合使用方法
- 【必看】这6个吓人的Linux命令,你用过吗?
- 为什么有的电路中要有两单片机
- 【CLR】解析AppDomain
- IPVS和Nginx两种WRR负载均衡算法详解
- 史上最全的vim快捷键
- 静态网页制作小技巧(logo及字体图标)
- php tpshop,TPshop是什么意思?
- 这两款好用的识别图片文字的软件app值得你们收藏
- 【PTA 7-9】剥洋葱
- 传统家装有落差,VR全景家装让你体验新房落成效果
- 密码学常用网站与解密脚本
- 我的达内Java培训经历
- 数据应用服务规划及建设思考
- Mac 版ps cs6 破解
- R语言批量提取excel当中的数据
- BorderStyle short usage
- 快速排序算法 ( 挖坑法 ) ------- C语言