C#异步编程学习笔记之-async和await
一、异步方法介绍(async和await):
如果使用async修饰符将某种方法指定为异步方法,即启用以下两种功能。
1、标记的异步方法可以使用await来指定暂停点。await运算符通知编译器异步方法:在等待的异步过程完成后才能继续通过该点。 同时,控制返回至异步方法的调用方。
异步方法在await表达式执行时暂停并不构成方法退出,只会导致 finally 代码块不运行。
2、标记的异步方法本身可以通过调用它的方法等待。
注意:
★ 异步方法通常包含await运算符的一个或多个实例,但缺少await表达式也不会导致生成编译器错误(编译器将为此类方法发布一个警告),如:
★ 如果异步方法未使用await运算符标记暂停点,那么异步方法会作为同步方法执行,即使有async修饰符,也不例外。
二、异步方法示例:
使用async关键字定义的异步方法简称为“异步方法”,如:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
//耗时处理,需要异步执行
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); //这里是不需要异步执行的内容
DoIndependentWork(); //使用await标记为异步获取结果,并把AccessTheWebAsync方法挂起,控制返回至异步方法的调用方。
string urlContents = await getStringTask; //直到异步结果返回,才执行这里
return urlContents.Length;
}
如果 AccessTheWebAsync 在调用 GetStringAsync 和等待其完成期间不能进行任何工作,则你可以通过在下面的单个语句中调用和等待来简化代码:
string urlContents = await client.GetStringAsync();
意思是,一个异步方法内部可以用await标记多个点。
三、异步方法特征:
1、方法签名包含 async 修饰符。
2、按照约定,异步方法的名称以“Async”后缀结尾。
3、返回类型为下列类型之一:
※ 如果你的方法有操作数为 TResult 类型的返回语句,则为 Task<TResult>。
※ 如果你的方法没有返回语句或具有没有操作数的返回语句,则为 Task。
※ void:如果要编写异步事件处理程序。
※ 包含 GetAwaiter 方法的其他任何类型(自 C# 7.0 起)。
4、方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控制返回到方法的调用方。
5、异步方法无法声明 in、ref 或 out 参数,但可以调用包含此类参数的方法。 同样,异步方法无法通过引用返回值,但可以调用包含 ref 返回值的方法。
四、异步方法的运行机制:
五、返回类型和参数:
异步方法通常返回 Task 或 Task<TResult>。 在异步方法中,await 运算符应用于通过调用另一个异步方法返回的任务。
如果方法包含指定 TResult 类型操作数的 return 语句,将 Task<TResult> 指定为返回类型。
如果方法不含任何 return 语句或包含不返回操作数的 return 语句,将 Task 用作返回类型。
下面的示例演示如何声明并调用可返回 Task<TResult> 或 Task 的方法:
//声明返回类型为Task<TResult>,即TResult
async Task<int> TaskOfTResult_MethodAsync()
{
int hours;
// . . .
//返回值为int类型
return hours;
} //调用TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
//标记为异步返回
int intResult = await returnedTaskTResult;
//另一种方式
int intResult = await TaskOfTResult_MethodAsync();
//声明返回类型为Task,即void
async Task Task_MethodAsync()
{
// . . .
} //调用Task_MethodAsync
Task returnedTask = Task_MethodAsync();
//标记为异步返回
await returnedTask;
//另一种方式
await Task_MethodAsync();
来源:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/index
C#异步编程学习笔记之-async和await的更多相关文章
- C#异步编程学习笔记之-async和await(续)
书接上文,本篇主要记录的内容要点:1.针对async和await在实际应用中的使用方式:2.异步方法返回值(有返回值和无返回值)的两种情况: 示例一(无返回值): using System; usin ...
- ES6/7 异步编程学习笔记
前言 在ES6的异步函数出现之前,Js实现异步编程只有settimeout.事件监听.回调函数等几种方法 settTmeout 这种方法常用于定时器与动画的功能,因为其本质上其实是浏览器的WebAPI ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——异步调用WCF服务
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
- 多线程编程学习笔记——使用异步IO
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端
接上文 多线程编程学习笔记——使用异步IO 二. 编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...
随机推荐
- Kafka 概述
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. Kafka 中,客户端和服务器之间的通信是通过 TCP 协议完成的. 一.传统消息 ...
- 浅谈WebView在新窗口浏览网页(setSupportMultipleWindows()与onCreateWindow()关系)
一,写在前面 我们平常使用电脑浏览器浏览网页可能会有三种方式: 1.新窗口 2.当前窗口种的新选项卡 3.当前选项卡或者窗口 我们知道在电脑系统中同一时间可以开启多个相同的进程,就像你可以同时登陆2个 ...
- 演示Java如何调用Mysql的过程和函数
这里只演示Java如何调用Mysql的过程和函数 --------------------------------------------------------------------------- ...
- SHA加密
import java.security.MessageDigest; /** * 提供SHA加密 */ public class SHAUtil { // 进行SHA-1加密 public stat ...
- visible,invisible和GONE的区别
在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”.“invisible”.“gone”.主要用来设置控制控件的显示和隐藏.有些人可能会疑惑In ...
- Android提升Gradle编译速度或减少Gradle编译时间.md
目录 Android如何提升Gradle编译速度或减少Gradle编译时间 最终优化方案 优化效果比对 将所有项目源码,各种缓存临时目录都移动到高性能SSD磁盘上 gradle.properties ...
- mysql 批量kill locked 进程
mysql -s -e "show processlist;" | grep 'Sending data' | awk '{print "kill "$1&qu ...
- Product - 产品经理 - 内容
特别说明 本文是已读书籍的学习笔记和内容摘要,原文内容有少部分改动,并添加一些相关信息,但总体不影响原文表达. - ISBN: 9787568041591 - https://book.douban. ...
- OpenCV图像平移
图像平移是将图像的所有像素坐标进行水平或垂直方向移动,也就是所有像素按照给定的偏移量在水平方向上沿x轴.垂直方向上沿y轴移动.这种操作分为两种,一种是图像大小不改变,这样最后原图像中会有一部分不在图像 ...
- 关于kail的远程连接
昨天开始学关于网络攻防的一下知识,虚拟机的镜像用的是kail,对自己造成了很多不适应的地方,有点自闭了. 最近会和大家分享一些关于kail的问题或者说网络攻防方面.这次就说一下kail的远程服务. k ...