ASP.Net中的async+await异步编程的实现

在.NET Framework4.5框架、C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP)。在这种方式下,可以通过类似同步方式编写异步代码,极大简化了异步编程模型。

用法:

public async Task<int> GetDotNetCountAsync()
{
  // Suspends GetDotNetCount() to allow the caller (the web server)
  // to accept another request, rather than blocking on this one.
  var html = await _httpClient.GetStringAsync("https://dotnetfoundation.org");

  return Regex.Matches(html, @"\.NET").Count;
}

要点!!!

1.“async”用来标记一个方法为异步方法,异步方法体内需结合“await”关键字使用,如果没有await,则该方法等同于一个普通方法。异步方法命名规则通常以Async结尾。

2.“await”关键字只能在异步方法中使用。

3.当在async异步方法中遇到await操作时,await会阻塞该异步方法不继续往下执行,并将该异步方挂起,将控制权转到该异步方法的调用者手中。

4.异步方法的调用者获得控制权之后:

1)如果调用者需要使用异步方法的返回结果,则继续等待异步方法执行完毕,再继续往下执行。

2)如果调用者不关心异步方法的返回结果,则继续往下执行。

场景一:async方法中未使用await

static void Main(string[] args)
    {
      Console.WriteLine("执行前Main.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤①
      GetResultAsync();
      Console.WriteLine("执行结束Main....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤②
      Console.ReadKey();
    }

    async static Task<int> GetResultAsync()
    {
      Console.WriteLine("执行前GetResult.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤③      Task.Delay(3000).Wait();
      Console.WriteLine("执行结束GetResult.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤④
      return 10;
    }

执行结果:步骤① ——>步骤③——>步骤④——>步骤②

结果分析:

我们会发现,主函数Main调用异步方法GetResultAsync时,由于异步方法缺少“await”关键字,主函数需等异步方法步骤3,4全部执行结束后再继续执行步骤2,执行顺序完全和同步方法执行顺序一致;

并且异步方法会给出语法提示:缺少“await”关键字

场景2:异步方法体内遇到await之后,立即将控制权转到调用者手中

static void Main(string[] args)
    {
      Console.WriteLine("执行前Main.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤①       GetResultAsync();
      Console.WriteLine("执行结束Main....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤②
      Console.ReadKey();
    }
    async static Task<int> GetResultAsync()
    {
      Console.WriteLine("执行前GetResult.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤③
      await Task.Delay(3000);
      Console.WriteLine("执行结束GetResult.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤④
      return 10;
    }

执行结果:步骤① ——>步骤③——>步骤②——>步骤④

结果分析:

我们会发现,主函数Main调用异步方法GetResultAsync,在遇到异步方法中“await”关键字时

1)阻塞了当前异步方法并立即将控制权转交给调用者主函数Main

2)主函数获得控制权后继续执行方法体内步骤2,GetResultAsync方法则异步执行(等待异步操作结束之后执行步骤4)。

场景3:异步方法体内遇到await之后,立即将控制权转到调用者手中,调用者需等待异步方法返回结果

static void Main(string[] args)
    {
      Console.WriteLine("执行前Main.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤①
      Task<int> res = GetResultAsync();
      Console.WriteLine("执行结束Main....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤②
      Console.WriteLine("执行结果:" + res.Result + "....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤③
      Console.ReadKey();
    }
    async static Task<int> GetResultAsync()
    {
      Console.WriteLine("执行前GetResult.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤④
      await Task.Delay(3000);
      Console.WriteLine("执行结束GetResult.....线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());//步骤⑤
      return 10;
    }

执行结果:步骤① ——>步骤④——>步骤②——>步骤⑤——>步骤③

结果分析:

我们会发现,主函数Main调用异步方法GetResultAsync,在遇到异步方法中“await”关键字时

1)阻塞了当前异步方法并立即将控制权转交给调用者主函数Main

2)主函数获得控制权后继续执行方法体内步骤2和步骤3,GetResultAsync方法则异步执行。

3)当主函数执行步骤3时,由于步骤3需要打印异步方法的返回结果,故需要等待异步方法结束才能继续。所以需先执行步骤5,然后再继续执行步骤3。

最后,异步编程的时候我们通常会结合Task来使用

到此这篇关于ASP.Net中的async+await异步编程的实现的文章就介绍到这了,更多相关ASP.Net async+await异步编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET 谨用 async/await

    C# 5.0 引入 async/await 关键字,旨在简化异步编程模型,抛去语法糖就是 Net4.0 的 Task + 状态机.其实在处理异步编程使用 Task 还是挺简单的,不过既然推出了新的语法糖,难免会尝试一下,然而在使用中却没想象中那么单纯.以下针对ASP.NET 应用程序实际使用过程中的一些总结, 包括 异常捕获 . 死锁 . 应用程序崩溃 ,实际使用过程中一不注意就可能掉坑里了. 异常捕获 async 方法有三种返回类型: void.Task.Task async void 该方式

  • ASP.Net中的async+await异步编程的实现

    在.NET Framework4.5框架.C#5.0语法中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简化了异步编程模型. 用法: public async Task<int> GetDotNetCountAsync() { // Suspends GetDotNetCount() to allow the caller (the web server) // to accept another r

  • 三分钟学会用ES7中的Async/Await进行异步编程

    本文介绍了三分钟学会用ES7中的Async/Await进行异步编程,分享给大家,具体如下: Async/Await基本规则 async 表示这是一个async函数,await只能用在这个函数里面. await 表示在这里等待promise返回结果了,再继续执行. await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义了-) 一个Async/Await例子 Async/Await应该是目前最简单的异步方案了,首先来看个例子. 这里我们要实现

  • 在JS循环中使用async/await的方法

    async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度,本篇文章将分享在JS循环中使用async/await的方法. 在开发maty.js时,遇到一个数组任务,数组项是内部异步执行的函数,期望是同步依次执行每项函数,每项函数执行完本身的异步任务后,继续下一项. 刚开始单纯使用map来循环执行,并且await每项函数.如下所示: starters.map(async (fn,

  • 微信小程序中使用 async/await的方法实例分析

    本文实例讲述了微信小程序中使用 async await的方法.分享给大家供大家参考,具体如下: 微信小程序中有大量接口是异步调用,比如 wx.login().wx.request().wx.getUserInfo() 等,都是使用一个对象作为参数,并定义了 success().fail() 和 complete() 作为异步调用不同情况下的回调. 但是,以回调的方式来写程序,真的很伤,如果有一个过程需要依次干这些事情: wx.getStorage() 获取缓存数据,检查登录状态 wx.getSe

  • .net4.5使用async和await异步编程实例

    关于异步编程的简单理解: 在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单.通过特性可以将这项复杂的工作交给编译器来完成了.之前传统的方式来实现异步编程较为复杂,这样对于程序猿来说处理起来比较困难,调试也没那么方便,后续的维护工作也比较痛苦. Async和Await关键字是C#异步编程的核心.通过使用这两个关键字,你可以使用.NET Framework 或 Windows Runtime的资源创建一个异步方法如同创建一个同步方法一样容易. 接下来通过VS201

  • 理解Koa2中的async&await的用法

    Koa是一款非常著名的Node服务端框架,有1.x版本和2.x版本.前者使用了generator来进行异步操作,后者则用了最新的async/await方案 一开始使用这种写法的时候,我遇到一个问题,代码如下: const Koa = require('koa'); const app = new Koa(); const doSomething = time => { return new Promise(resolve => { setTimeout(() => { resolve('

  • 详解async/await 异步应用的常用场景

    前言 async/await 语法用看起来像写同步代码的方式来优雅地处理异步操作,但是我们也要明白一点,异步操作本来带有复杂性,像写同步代码的方式并不能降低本质上的复杂性,所以在处理上我们要更加谨慎, 稍有不慎就可能写出不是预期执行的代码,从而影响执行效率.下面将简单地描述一下一些日常常用场景,加深对 async/await 认识 最普遍的异步操作就是请求,我们也可以用 setTimeOut 来简单模拟异步请求. 场景1. 一个请求接着一个请求 相信这个场景是最常遇到,后一个请求依赖前一个请求,

  • .NET2.0版本中基于事件的异步编程模式(EAP)

    一.引言 APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的. 微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是基于事件的异步编程模型——EAP(Event-based Asynchronous Pattern ). 二.介绍 实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类

  • spring boot中使用@Async实现异步调用任务

    什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序.  同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) package com.kfit.task; import java.uti

随机推荐