C# 关于异步等待async/await的学习理解

C# 提供了Task来实现异步操作,Task.Run可以很方便的启动一个线程执行异步任务

异步操作能提高效率,但是不便于控制,假如我们要获得异步任务的执行结果,如果采用回调的方式,传值就比较麻烦

当然也可以直接调用Task.Result以同步的方式等待异步任务执行完毕后获得结果再行处理,但是这样就会导致当前线程被阻塞,浪费性能,让人很不爽

而async/await就能避免这个问题,当我们在一个函数中使用await的时候,代码执行到这里就会停下来等待异步函数执行完毕,但是此时当前线程却不是阻塞的,因为await本质上是一个可轮询状态机,等异步任务执行完毕后,就会调用线程(应该是新的线程吧)执行之前暂停的代码,从感官上来说能以同步的形式来处理异步函数,从性能上来说,避免了当前线程的阻塞一定程度上提高了性能

仅个人理解,不知道有没有错误的地方,如有望指出,共同进步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
static void Test() {
    Console.WriteLine("Test start...");
    AAA(); //同步执行,阻塞线程
    BBB(); //这里为了终止async/await的传染,没有等待,所以直接过去,不是异步等待
    Console.WriteLine("Test end");
}
static void AAA() {
    var task = Task.Run(() => {
        Console.WriteLine("task执行");
        Thread.Sleep(3000);
        return 123;
    });
    task.Wait(); //同步等待,会阻塞线程,直到异步函数执行完毕
    //task.Result; //获取返回值的方式
    Console.WriteLine("task执行等待完成");
}
/// <summary>
/// 非async修饰的函数可以直接调用BBB,整体上是个异步函数
/// 如果外部还是需要等待,就不能void,需要至少返回Task,调用的时候继续await
/// </summary>
static async void BBB() {
    var task = Task.Run(() => {
        Console.WriteLine("task执行");
        Thread.Sleep(3000);
        return 123;
    });
    int result = await task; //异步等待,await本质上是一个可轮询状态机,不会阻塞线程
    //等task异步函数执行完毕后会再切到这里继续执行代码
    Console.WriteLine("task执行等待完成,result=" + result);
}

  

posted @   WmW  阅读(1367)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示