await和async再学习
await太不容易理解了,自己常常迷惑,不知道该怎么用。
这篇文章,有一个很清晰的描述:
使用Async标记方法Async1为异步方法,用Await标记GetRequestStreamAsync表示方法内需要耗时的操作。主线程碰到await时会立即返回,继续以非阻塞形式执行主线程下面的逻辑。当await耗时操作完成时,继续执行Async1下面的逻辑。
static async void Async1()
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://cnblogs.com/");
await myReq.GetRequestStreamAsync();
//to do 当上面await耗时任务完成后,程序会回到await标记的地方继续往下执行 Console.WriteLine("请求结束了");//网络请求结束,会执行该输出
DoSomeThing();
DoSomeThing2();
DoSomeThing3();
//方法结束
}
以上文章可以详细阅读,在看本文。
可以反复阅读微软的介绍文章,文章标题:使用 Async 和 Await 的异步编程 (C#)
地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/index
使用“async” 关键字定义的异步方法简称为“异步方法”。
下面是微软的官方示例异步方法代码:
// Three things to note in the signature:
// - The method has an async modifier.
// - The return type is Task or Task<T>. (See "Return Types" section.)
// Here, it is Task<int> because the return statement returns an integer.
// - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{
// You need to add a reference to System.Net.Http to declare client.
HttpClient client = new HttpClient(); // GetStringAsync returns a Task<string>. That means that when you await the
// task you'll get a string (urlContents).
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); // You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork(); // The await operator suspends AccessTheWebAsync.
// - AccessTheWebAsync can't continue until getStringTask is complete.
// - Meanwhile, control returns to the caller of AccessTheWebAsync.
// - Control resumes here when getStringTask is complete.
// - The await operator then retrieves the string result from getStringTask.
string urlContents = await getStringTask; // The return statement specifies an integer result.
// Any methods that are awaiting AccessTheWebAsync retrieve the length value.
return urlContents.Length;
}
这个方法需要注意四个地方:
1,方法返回类型前的关键字“async”;
2,异步方法名称以Async结尾,表示方法是异步方法(这是一种惯例,或者说约定……);
3, 方法内部有一段不好理解:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
client的静态方法GetStringAsync也是个异步方法,当执行到方法内部的await时,会直接返回到调用方AccessTheWebAsync,也就是当前方法,所以就可以在GetStringAsync方法下调用不依赖GetStringAsync方法返回值的方法DoIndependentWork。
4,标记await的地方,是异步方法放回调用方的地方。注意这个地方!
string urlContents = await getStringTask;
当执行到这个地方时,异步方法AccessTheWebAsync会返回调用方。这里没有写对方法AccessTheWebAsync的调用代码。
假如你在某个地方调用它的话你可以调试看一看,方法AccessTheWebAsync是不是还没执行完,就已经返回了。
以上让人主要到几点:
1,在一个方法的返回类型前加关键字async;
2,把方法名,命名为以Async结尾,方便人一眼认出这是个异步方法(因为惯例);
3,在方法内耗时调用前加上await关键字,然后执行到该处时,程序直接返回到当前方法的外部调用处,让调用处下面代码可以继续执行,当当前方法耗时任务完成时,程序再返回到await处继续向下执行,然后执行完毕该异步方法(执行完,程序会转到跳进来的地方,这个到底怎么保证,就需要额外研究了……)。
蓝色地方可能不好理解,大概意思是这么个意思:
static void Main(string[] args)
{
string inputStr=Console.ReadLine();
GetLongTimeConsumingQuery(inputStr)
Console.WriteLine("查询中……");
Console.ReadKey();
} public Async void GetLongTimeConsumingQuery(string inputStr)
{
//在指定文件夹下,从大量txt日志文件中找到包含某个字符的错误日志 Task<string> getStringTask=await QueryLog(inputStr)
string logFileNames = await getStringTask; Console.WriteLine("你查询的关键字在以下日志中"+logFileNames+"出现!");
Console.WriteLine("感谢使用程序结束!");
}
执行到方法GetLongTimeConsumingQuery内的await处,方法会返回到Main方法,调用处然后向下执行输出“查询中……”
当QueryLog方法执行完毕后,程序会跳转到await处继续向下执行。
await和async再学习的更多相关文章
- C#同步,异步的理解,包括5.0中await和async(学习笔记)
之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...
- 小白终于弄懂了:c#从async/await到Task再到Thread
1. 为什么会有/怎么解决: async/await的无限嵌套 public async Task<int> myFuncAsync1() { //some code int num = ...
- C#中的异步编程--探索await与async关键字的奥妙之处,原来理解和使用异步编程可以这么简单
前言 await与async是C#5.0推出的新语法,关于await与async有很多文章讲解.但看完后有没有这样一种感觉,感觉这东西像是不错,但好像就是看不太懂,也不清楚该怎么使用.虽然偶有接触,但 ...
- 小心C# 5.0 中的await and async模式造成的死锁
平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为as ...
- await和async更多的理解
最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...
- C#语法——await与async的正确打开方式
C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- [转]小心C# 5.0 中的await and async模式造成的死锁
原文链接 https://www.cnblogs.com/OpenCoder/p/4434574.html 内容 UI Example Consider the example below. A bu ...
- 图解 Await 和 Async
原文链接:Await and Async Explained with Diagrams and Examples 文章目录 简介 Promise 问题:组合 Promise Async 函数 Awa ...
随机推荐
- ndk-build 学习笔记
# 必须以local_path 开头# 定位源文件LOCAL_PATH := $(call my-dir) #引入clear-vars.mk文件,清除除local_path以外的其他local_< ...
- zepto 基础知识(5)
81.width width() 类型:number width(value) 类型:self width(function(index,oldWidth){....}) 类型:self 获取对象集合 ...
- Spring的声明式事务----Annotation注解方式(1)
这里列一个小的demo工程,直接利用Spring的jdbcTemplate访问Mysql数据库. 工程结构: 数据库中的tbl_student表结构如下: 数据实体类Student.java代码如下: ...
- 如何在linux中创建虚拟环境
安装虚拟环境的命令 : sudo pip install virtualenv sudo pip install virtualenvwrapper 安装完虚拟环境后,如果提示找不到mkvirtual ...
- MyEclipse格式化JSP代码,其中Javascript无法格式化的原因
MyEclipse格式化JSP代码,其中Javascript无法格式化的原因: 可能是JSP页面代码有错误的地方,而且可能是一个很微小的错误,比如多写了一个标点符号,这个需要仔细检查,包括HTML.C ...
- jquer搜索
<body> <br/> <center> <tr><td>创建时间:</td><td><input type ...
- npm 如何提升最新版本
首先我们查看一下npm当前版本,打开cmd 运行命令: npm -v 如果不是最新版本,运行一下代码即可. npm install -g npm 这样npm就更新到最新版本了. 如果想更新到指定版本, ...
- LINUX SSH 建立密钥对
配置私钥和公钥 先检查一下服务器的ssh配置文件 /etc/ssh/sshd_config RSAAuthentication yes # 启用 RSA 认证 默认为 yes PubkeyAuthen ...
- CentOS下配置jdk
CentOS下配置jdk 1.在jdk官网上下载最新版本的jdk 2.将jdk放到相应的位置,使用如下命令来解压. .0_181 /opt/data/ tar -zxf jdk-8u181-linux ...
- Python学习 :深浅拷贝
深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...