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";
    }
相关推荐
追光少年332238 分钟前
Learning Vue 读书笔记 Chapter 4
前端·javascript·vue.js
软件20540 分钟前
【Vite + Vue + Ts 项目三个 tsconfig 文件】
前端·javascript·vue.js
不会打代码呜呜呜呜1 小时前
小白零基础--CPP多线程
开发语言·c++·算法
涛ing1 小时前
【5. C++ 变量作用域及其深入探讨】
java·linux·c语言·开发语言·c++·ubuntu·vim
老大白菜1 小时前
在 Ubuntu 中使用 FastAPI 创建一个简单的 Web 应用程序
前端·ubuntu·fastapi
渔阳节度使1 小时前
React
前端·react.js·前端框架
Hi Man1 小时前
Python之如何在Visual Studio Code 中写的python程序打包成可以在Windows系统下运行的.exe程序
开发语言·vscode·python
CHANG_THE_WORLD2 小时前
C++并发编程指南04
开发语言·c++
powershell 与 api2 小时前
C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)
开发语言·windows·c#·.net
SomeB1oody2 小时前
【Rust自学】19.2. 高级trait:关联类型、默认泛型参数和运算符重载、完全限定语法、supertrait和newtype
开发语言·后端·rust