You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步执行顺序是否重要?C#异步代码执行差异疑问

C#异步编程中Task并行与顺序执行的核心差异

你困惑的核心点在于:Task的启动是在调用异步方法的瞬间,而非执行await语句的时候。

先看第一段代码:

Task task_teeth = brushTeethAsync();
Task task_shoes = wearShoesAsync();

await task_teeth;
await task_shoes;

当你调用brushTeethAsync()时,方法会立刻同步执行:先打印Brushing your teeth!,直到遇到await Task.Delay(10000)——此时该方法挂起,返回一个尚未完成的Task对象。紧接着你调用wearShoesAsync(),同样立刻执行:打印Putting on shoes!,遇到await Task.Delay(1500)后挂起,返回未完成的Task。这时候两个Task已经在后台同时运行了,后续的await只是等待它们各自完成,所以最终是并行执行的效果。

再看第二段代码:

Task task_teeth = brushTeethAsync();
await task_teeth;

Task task_shoes = wearShoesAsync();
await task_shoes;

调用brushTeethAsync()后,方法启动并执行到挂起点,返回Task。但你紧接着就await这个Task——这会让当前执行流程暂停,直到这个Task完全完成(也就是等10秒,Finished brushing teeth打印出来),才会继续执行下一行代码。只有这时候,wearShoesAsync()才会被调用,穿鞋的任务才开始启动,所以最终是顺序执行的结果。

补充下异步方法的执行逻辑:异步方法被调用后,会先同步执行到第一个未完成的await处,之后返回Task;剩下的代码逻辑会在await的Task完成后,通过回调继续执行。所以决定任务是否并行的关键,是你是否在等待前一个任务完成前,就启动了下一个任务。

你的异步方法实现如下:

public static async Task brushTeethAsync()
{
    Console.WriteLine("Brushing your teeth!");
    await Task.Delay(10000);
    Console.WriteLine("Finished brushing teeth");
}

public static async Task wearShoesAsync()
{
    Console.WriteLine("Putting on shoes!");
    await Task.Delay(1500);
    Console.WriteLine("Finished wearing the shoes");
}

内容的提问来源于stack exchange,提问作者X HOxha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:20:09