异步 Async & Await

发布时间 2023-07-20 16:03:15作者: 爱学习VS

async在C#世界里是上下文关键字。它只有在修饰一个方法的时候才自动被编译器识别为关键字,在代码的其他位置上可以被用作变量名等其他任何用途。
async关键字用来修饰两类方法: lambda表达式或者异步方法。
拥有async修饰的方法称为async方法,比如:

就如上面这个方法ExampleMethodAsync(),微软爷爷特别喜欢在定义异步函数名字后习惯加个Async后缀(这不是必须的,加不加编译器既不会报错,也不会影响异步特性),告诉我们这个方法是个异步方法。我们在自己定义异步方法的时候,也可以照搬这个微软的习惯。
async修饰的方法内部,应当出现一个await关键字,两个关键字一般成对出现。当然,如果我们不小心忘记写await表达式或者语句,这个async方法默认按照同步方式运行,同时,编译器会友好地提示我们是不是漏写了await。此外,async方法内部,可以有多个await语句。
awiat运行的语句,一般都是比较费时的任务(也就是会阻塞主线程的一些操作,比如获取Http应答,写入文档,保存数据库等),要不然就不需要异步了。

 async方法可以是下面三种返回类型:

  • Task
  • Task<TResult>
  • void 这种返回类型一般用在event事件处理器中,或者用在你只需要任务执行,不关心任务执行结果的情况当中。
  • 任何其他具有GetAwaiter方法的类型(从C#7.0开始)
  • 注意,我们无法等待(awiat)一个async void 方法。  

using System;
using System.Threading.Tasks;
using System.Threading;

namespace test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} Hello, I am Caller!");
DoAsync();
Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} Hello, I am Caller too!");
Console.Read();
}
public static async void DoAsync()
{
System.Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} In DoAsync(), before SunAsync()");
await SunAsync();
System.Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} After SunAsync(), DoAsync() End.");
}
public static async Task SunAsync()
{
var t = Task.Run(()=>{
System.Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} New Task~");
for(int i=0 ; i<10; i++)
{
Thread.Sleep(1000);
System.Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} I am playing game...");
}
});
System.Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} After Task, before await.");
await t;
System.Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId} After await, before SunAsync() exit.");
}
}
}

运行结果:

 

(206条消息) C# Task和async/await详解_c# task await_btfireknight的博客-CSDN博客

(206条消息) C#-Async关键字(异步方法)_c#async_MrLss的博客-CSDN博客