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 ...
随机推荐
- Autofac4.0以上的版本通过json配置文件方式实现IOC的MVC5设置
我们知道java用到了spring来实现IOC,而我们学习的.net也有.net spring.但是.net spring现在没人维护了,进公司后发现公司使用到了autofac.但是用的是3.X的版本 ...
- Form表单之复选框checkbox操作
input复选(checkbox): <label>input复选1组:</label> <input type="checkbox" name=&q ...
- ABAP术语-BOR (Business Object Repository )
BOR (Business Object Repository ) 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/25/1013523.ht ...
- 在Python中使用正则表达式去掉字符串里的html标签
有时候会获得一些带html标签的字符串,需要把html标签去掉,获得干净的字符串,这时候可以使用正则表达式. 代码如下: import re htmeString = '''<ul id=&qu ...
- Python序列删除重复数据
## 对于列表来说,若不保持原有顺序,可以直接转换为set删除重复数据 nums = [1,2,32,2,2,4,3,2,3,42] nums = list(set(nums)) print(nums ...
- Python的jieba模块简介
现如今,词云技术遍地都是,分词模块除了jieba也有很多,主要介绍一下jieba的基本使用 import jieba import jieba.posseg as psg from os import ...
- python3 练习题100例 (二十七)列表元素改写
题目内容: 输入一个列表alist,要求列表中的每个元素都为正整数且不超过10: 将列表中的奇数变为它的平方,偶数除以2后打印新的列表(新的列表中所有元素仍都为整数). 可以使用以下实现列表alist ...
- IO复用——select系统调用
1.select函数 此函数用于在一段时间内,监听用户感兴趣的文件描述符上的可读.可写和异常等事件. #include<sys/select.h> int select(int nfds, ...
- (数据科学学习手札02)Python与R在循环语句与条件语句上的异同
循环是任何一种编程语言的基本设置,是进行批量操作的基础,而条件语句是进行分支运算的基础,Python与R有着各自不同的循环语句与条件语句语法,也存在着一些相同的地方. Python 1.for循环 ' ...
- c++ map的使用方法
1.头文件:#include<map> 2.定义:map<typename1,typename2> mp 注:字符串数组只能用string而不能使用char[] 3.访问方式: ...