c#异步async和await

摘要:
包含await表达式/语句的方法,为异步方法,方法声明必须标记为async。异步方法在await表达式执行时暂停并不构成方法退出,只会导致finally代码块不运行。例如:publicasyncTaskGetLeisureHoursAsync(){}2,如果异步方法不含任何return语句或包含不返回操作数的return语句,将Task用作返回类型。在大多数情况下,应通过使用await访问此值,而不是直接访问属性。

包含await表达式/语句的方法,为异步方法,方法声明必须标记为async。(反之不一定,async标记的方法,可以没有await表达式,那就是正常的方法,编译器只是警告而已)

作用和机制:

await 用来指定(当前异步方法的)暂停点。 await 运算符通知编译器异步方法:在等待的异步过程(await 表达式)完成后才能继续通过该点。 同时,控制返回至异步方法的调用方。这样主线程就会继续执行。

异步方法在 await 表达式执行时暂停并不构成方法退出(只是暂停本方法,等await 语句完成后继续执行),只会导致 finally 代码块不运行。

返回类型:

1,如果异步方法包含指定 TResult 类型操作数的 return 语句,将 Task<TResult> 指定为返回类型。例如:public async Task<int> GetLeisureHoursAsync(){}

2,如果异步方法不含任何 return 语句或包含不返回操作数的 return 语句,将 Task 用作返回类型。例如public async Task ShowTodaysInfoAsync(){}

3,返回void,仅适用于事件处理程序,例如:public async void OnButtonClicked1(){}(注意无法等待返回 void 的异步方法, 所以不能这么写:await OnButtonClicked1())

4,从 C# 7.0 开始,异步方法可返回任何具有可访问的 GetAwaiter 方法的类型。

TaskTask<TResult> 是引用类型,因此,性能关键路径中的内存分配会对性能产生负面影响,尤其当分配出现在紧凑循环中时。 支持通用返回类型意味着可返回轻量值类型(而不是引用类型),从而避免额外的内存分配,.NET 提供 System.Threading.Tasks.ValueTask<TResult> 结构作为返回任务的通用值的轻量实现,例如:

static async ValueTask<int> RollAsync() { await Task.Delay(500); int diceRoll = s_rnd.Next(1, 7); return diceRoll; }

await使用方式:

1,await语句,执行后不返回值

WaitAndApologizeAsync 方法不包含 return 语句或者不返回任何结果的return语句,应用此方式await SomeTaskMethodAsync()

2,await表达式,执行并获取返回值

SomeTaskMethodAsync方法返回Task<TResult>,应用此方式: T result = await SomeTaskMethodAsync<T>();

也就是说 await 会从 Task<TResult> 中检索结果TResult,赋值给result

此表达式也可以分离成两句:

Task t=SomeTaskMethodAsync<T>();//这里不暂停

T result=await t;//到这里才暂停

多线程:

asyncawait 关键字不会创建其他线程。 因为异步方法不会在其自身线程上运行,因此它不需要多线程

注意:

异步方法无法声明 inrefout 参数,但可以调用包含此类参数的方法。 同样,异步方法无法通过引用返回值,但可以调用包含 ref 返回值的方法。

Task.Result 属性为阻止属性如果你在其任务完成之前尝试访问它,当前处于活动状态的线程将被阻止,直到任务完成且值为可用。 在大多数情况下,应通过使用 await 访问此值,而不是直接访问属性。

免责声明:文章转载自《c#异步async和await》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇httprunner如何判断数据库中存储的是不是乱码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Dapper.Contrib

public T Query(string sql, object param) { using (IDbConnection dbConnection = Connection) { if (dbConnection.State == Connect...

Python-进程与线程

进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就...

【转】在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0#consumption-patterns 在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求 2021/01/21...

c#之多线程之为所欲为

一 什么是多线程 1、 什么是进程?一个 exe 运行一次就会产生一个进程,一个 exe 的多个进程之 间数据互相隔离。 2、 一个进程里至少有一个线程:主线程。我们平时写的控制台程序默认就是单线程的,代 码从上往下执行,一行执行完了再执行下一行; 3、 什么是多线程:一个人两件事情同时做效率高。同一时刻一 个人只能干一件事情,其实是在“快速频繁切换”,如...

net core体系-网络数据采集(AngleSharp)-1初探

有这么一本Python的书: <<Python 网络数据采集>> 我准备用.NET Core及第三方库实现里面所有的例子. 这是第一部分, 主要使用的是AngleSharp:https://anglesharp.github.io/ (文章的章节书与该书是对应的) 发送Http请求 在python里面这样发送http请求, 它使...

StackExchange.Redis.DLL 操作redis加强版

直接引用StackExchange.Redis.dll这一个dll来操作redis App.config配置 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime...