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

Async与await执行逻辑疑问:await后方法剩余代码未执行排查

问题原因分析
  • async/await的执行规则:当async方法执行到await关键字时,会立即将当前方法暂停,返回一个未完成的Task对象,并将await之后的剩余代码注册为该Task的延续回调,只有等await等待的异步操作完成后,才会回到暂停位置继续执行剩余代码。
  • 代码核心问题:Main方法中仅启动了MakeCoffeeAsync和FryEggs两个异步任务,拿到对应的Task对象后,没有等待任务执行完成就直接停止了秒表、执行完了Main的所有逻辑。控制台应用的主方法执行结束后,整个应用进程会直接退出,后台还没执行完的异步任务延续代码自然没有机会运行。
  • 计时逻辑问题:在启动两个任务后立刻停止了秒表,此时两个异步任务都还在等待Task.Delay完成,统计到的耗时自然为0。
修复方案

只需要在stopWatch.Stop()之前添加等待两个任务全部完成的逻辑即可,使用await Task.WhenAll()可以实现并行等待两个任务执行完毕:

static async Task Main(string[] args)
{ 
    Stopwatch stopWatch = new Stopwatch();
    Task<Coffee> coffeeTask = MakeCoffeeAsync(stopWatch);           
    Task<Egg> eggTask = FryEggs(2);
    // 新增:等待两个异步任务全部执行完成
    await Task.WhenAll(coffeeTask, eggTask);
    stopWatch.Stop();
    TimeSpan ts = stopWatch.Elapsed;
    string elapsedTime = String.Format("{0:00}", ts.Seconds);
    Console.WriteLine("Time to make breakfast: " + elapsedTime + " seconds");
}
修复后执行逻辑说明
  1. 调用MakeCoffeeAsync启动煮咖啡任务,执行到await Task.Delay(5000)时暂停,返回未完成的coffeeTask
  2. 主线程继续调用FryEggs启动煎鸡蛋任务,执行到await Task.Delay(3000)时暂停,返回未完成的eggTask
  3. 主线程执行await Task.WhenAll,进入等待状态,两个异步任务并行执行
  4. 3秒后煎鸡蛋的Task.Delay完成,回到煎鸡蛋方法的暂停位置,执行后续煎鸡蛋的逻辑
  5. 5秒后煮咖啡的Task.Delay完成,回到煮咖啡方法的暂停位置,执行后续煮咖啡的逻辑
  6. 两个任务全部完成后,Task.WhenAll返回,主线程继续执行,停止秒表统计总耗时,最终总耗时约为5秒,符合异步并行执行的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:54:00