异步 Async & Await
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博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix