C# 中 async 与 await 关键字详解

asyncawait 关键字的作用是使方法能够异步执行并等待异步操作的完成。(最重要的一点是记住 "异步执行"与"等待异步操作完成",不是等待主线程操作完成)

async 修饰符可将 方法、lambda 表达式或匿名方法指定为异步。

  1. async 关键字用于声明该方法是异步方法,允许其中使用 await 操作符等待异步操作完成。

  2. await 操作符用于等待异步操作的完成,并将执行控制权返回给调用方,使得线程不会被阻塞。

注意事项:

  • 使用await必须在async方法中:只能在标记为async的方法中使用await关键字。在同步方法中不能直接使用await。
  • 不要在UI线程中使用async和await:长时间运行的任务应该在其他线程上执行,以避免阻塞UI线程,影响用户交互。
  • 理解Task的生命周期:使用async和await时,需要理解Task的生命周期和状态,包括Wait、Result和WaitAsync等方法的使用。

1. 异步方法中的await调用

问题: 在异步方法中直接调用另一个async方法时,应该使用await吗?

解答: 是的,你应该在异步方法中使用await来调用另一个async方法。这样可以确保当前方法等待被调用的异步方法完成,并且能够利用await的优化,例如不会阻塞线程。

下面是代码示例

cs 复制代码
    static void Main(string[] args)
    {
        Console.WriteLine("Main thread is running...");
        // 创建一个异步任务
        var task = GetDataAsync();
        // 主线程继续执行其他任务
        Console.WriteLine("Main thread is doing other tasks...");
        // 等待异步任务完成
        task.Wait();
        // 获取异步任务的结果
        string data = task.Result;
        Console.WriteLine("Data received: " + data);
    }
    public static async Task<string> GetDataAsync()
    {
        Console.WriteLine("GetDataAsync started...");
        // 模拟耗时操作
        await Task.Delay(1000);//在这里等待的时间 去执行主线程 "Main thread is doing other tasks"
        Console.WriteLine("GetDataAsync completed...");
        return "Data from server";
    }
相关推荐
仿生狮子23 分钟前
✂️ Nuxt 最简单的字体裁剪工具:Fontize
javascript·vue.js·nuxt.js
石小石Orz3 小时前
我发现了开发者AI产品营收的新方向
前端·虚拟现实
老马识途2.03 小时前
关于跨域问题的总结
java·前端
魔力女仆4 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设
2401_894915534 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
麻瓜老宋5 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十二步,分号赋值链式修复、TOKEN_ASSIGN
c语言·开发语言·atomcode
别惊醒渔人5 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
颜酱5 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
用户059540174466 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
Larcher6 小时前
从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo
javascript·后端