通俗易懂带你彻底学会C#中async和await,学习中间件

背景基,正在看c#core项目,介绍中间件,提到异步,不是特别清楚,

 //快捷定义一个异步委托,它的作用是处理所有请求,都是这个委托,仅仅只是练习demo实际中几乎不可能这样用
            //因为它是一个终端中间件,调用即完成请求处理,返回,其他后面的内容根本没机会执行
            //这里的Async仅仅只是为了使用await,进行标记的lambda表达式
            app.Run(async context =>
            {
                //里面异步方法,可包含await表达式,下面方法是一个异步方法
                await context.Response.WriteAsync("await关键字,调用async结尾异步方法!");
            });

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.2#use-run-and-map

基于官方文档来学习, 基于官方文档来学习, ,基于官方文档来学习, 

总结如下: 

async一个是在定义声明标记异步强调声明,可供另一个关键字await来使用,一个在调用方调用时等异步执行完,它的中英文名字await非常形象生动,强调执行完,在调用这个方法,async和await几乎总是成双成对,

async返回类型必须是Task ,Task<T>,void三者之一,且有该关键字,

所谓异步方法,就是调用即马上返回Task,只是请理解返回的是一个Task任务而已,从感觉来看和一般方法执行完意思差不多,马上执行后面的内容,尽管在当前调用主线程,他并未真正执行完。

 

看代码

// 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. 事件处理程序调用并等待AccessTheWebAsync异步方法。

  2. AccessTheWebAsync创建一个HttpClient实例,并调用GetStringAsync异步方法以字符串形式下载网站的内容。

  3. GetStringAsync中发生了一些事情,这会暂停其进度。也许它必须等待网站下载或其他阻止活动。为了避免阻塞资源,GetStringAsync将控制权交给其调用者AccessTheWebAsync。

    GetStringAsync返回一个Task,其中TResult是一个字符串,AccessTheWebAsync将任务分配给getStringTask变量。该任务表示对GetStringAsync的调用的正在进行的过程,并承诺在工作完成后会产生一个实际的字符串值。

  4. 因为尚未等待getStringTask,所以AccessTheWebAsync可以继续进行其他不依赖于GetStringAsync最终结果的工作。通过调用同步方法DoIndependentWork来表示该工作。

  5. DoIndependentWork是一个同步方法,它将完成其工作并返回其调用方。

  6. AccessTheWebAsync耗尽了本该可以做的工作,而没有getStringTask的结果。AccessTheWebAsync接下来要计算并返回下载的字符串的长度,但是该方法只有在具有字符串之后,才能计算该值。

    因此,AccessTheWebAsync使用await操作符来暂停其进度并将控制权交给调用AccessTheWebAsync的方法。AccessTheWebAsync将Task(Of Integer)或Task <int>返回给调用方。该任务表示将产生一个整数结果,即下载的字符串的长度。

     注意

    如果在AccessTheWebAsync等待GetStringAsync(因此getStringTask)完成之前,控件将保留在AccessTheWebAsync中。如果调用的异步过程(getStringTask)已经完成,并且AccessTheWebSync不必等待最终结果,则挂起然后返回AccessTheWebAsync的开销将被浪费。

    在调用方(此示例中为事件处理程序)内部,重复该过程。在等待该结果之前,调用者可能会执行不依赖于AccessTheWebAsync结果的其他工作,否则,调用者可能会立即等待。当事件处理程序到达await表达式时,应用程序将重点放在GetStringAsync的完成上。事件处理程序正在等待AccessTheWebAsync,而AccessTheWebAsync正在等待GetStringAsync。

  7. GetStringAsync完成并产生一个字符串结果。调用GetStringAsync不会以您期望的方式返回字符串结果。(请记住,该方法已在步骤3中返回了一个任务。)相反,字符串结果存储在代表方法完成的任务getStringTask中。等待操作符从getStringTask检索结果。分配语句将检索到的结果分配给urlContents。

  8. 当AccessTheWebAsync具有字符串结果时,该方法可以计算字符串的长度。然后,AccessTheWebAsync的工作也完成了,等待事件处理程序可以恢复。在主题末尾的完整示例中,您可以确认事件处理程序检索并打印了长度结果的值。

 

async一个是在定义声明标记异步强调声明,可供另一个关键字await来使用,一个在调用方调用时等异步执行完,它的中英文名字await非常形象生动,强调执行完,在调用这个方法,async和await几乎总是成双成对,

async返回类型必须是Task ,Task<T>,void三者之一,且有该关键字,

所谓异步方法,就是调用即马上返回Task,只是请理解返回的是一个Task任务而已,从感觉来看和一般方法执行完意思差不多,马上执行后面的内容,尽管在当前调用主线程,他并未真正执行完。

 

  • 方法签名包括异步或异步修饰符。

  • 按照惯例,异步方法的名称以“ Async”后缀结尾。

  • 返回类型是以下类型之一:

    • 任务,如果你的方法,其中操作数的类型TResult return语句。

    • 任务,如果你的方法没有返回语句或具有不带操作数return语句。

    • Void(Visual Basic中的Sub),如果您正在编写异步事件处理程序。

    有关更多信息,请参见本主题后面的“返回类型和参数”。

  • 该方法通常至少包含一个await表达式,该表达式表示该方法要等到异步操作完成后才能继续。同时,该方法被挂起,控制权返回给该方法的调用者。

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110)?redirectedfrom=MSDN

看官方文档,本文内容几乎全是来自官方文档,这里转写,加深印象。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值