AI智能
改变未来

C# 异步


Asp.Net 异步async/await

什么是async/await?

我们经常说用同步的编码方式去写异步编程。

在NET FRAMEWORK框架中,函数分为

同步函数和异步函数两种。

  1. 同步函数:程序由上自下按照顺序进行执行。
  2. 异步函数:是一个语法糖。并不是一个全新的异步多线程使用方式。本身并不会产生新的线程,但是在程序进行时会产生多线程。await/async 依托于Task而存在的。不知道大家是否知道 Task.ContinueWith()它是task执行完毕后的一个回调函数。那么我们可以理解为:加了await,就等同于将后面的代码包装成了一个“回调”。

假如我们在做饭,按照同步的逻辑来进行应该是:

  1. 烧锅
  2. 洗菜
  3. 开始炒菜
  4. 等等。按照先后顺序进行执行。

最简单的例子:

static void Main(string[] args){ShowInfo();}private async static void ShowInfo(){await Task.Run(() =>{Console.WriteLine(\"Hello,World!\");});}

以上的例子在MacOS下用bash运行 dotnet run 发现控制台并没有输出来。
但是通过

static void Main(string[] args){ShowInfo();Console.ReadKey();}

就能打印出await中的Hello,World.这是为什么呢?

个人理解,因为我们用async声明了这个方法是可等待的,在等待的时候主程序已经跑完了剩下的代码。因此并没有打印出来。但是我们通过 ReadKey()来暂停。就可以发现await方法执行了,因此打印到了控制台。

在异步过程中,我们应该可以在烧锅的同时进行洗菜。不需要等待代码语句执行完后在继续执行下一条语句。
async/await 必须成对出现,async用来修饰方法,await用来修饰方法体。

public async Task<string> doSmt(){string exp = await GetExpTextAsync();}

在B/S中,当请求到Controller是,我们可以这样做:

[HttpPost]public async Task<TResult> GetList(){var dataList = await _xxx_XXXBus.GetDataListAsync();return dataList;}

当主线程按照顺序执行的时候,当他碰到await时,会回过头将自己的剩下要做的事情做完,然后回过头来开启一个新的线程去执行用 await 修饰的代码,按照从上到下的顺序同步执行代码,当代码执行完毕之后,再接着await后的代码。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » C# 异步