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

如何直观证明异步与同步代码的执行顺序存在差异?

同步 vs 异步代码的执行顺序差异演示

同步代码:严格的顺序执行

Thing[] stuff = Context.Things
    .Where(a => true)
    .ToArray();

Console.WriteLine("Boop");
  • 执行逻辑:
    1. 执行ToArray()时,当前线程会被完全阻塞,直到数据库查询结束、结果转换成Thing[]数组并完成赋值
    2. 只有等数组创建完成后,才会执行后续的Console.WriteLine("Boop")
    3. 整个过程线程无法处理其他任何任务

异步代码:非阻塞的挂起与恢复

Thing[] stuff = await Context.Things
    .Where(a => true)
    .ToArrayAsync();

Console.WriteLine("Beep");
  • 执行逻辑:
    1. 调用ToArrayAsync()后,方法会立即发起数据库查询请求,然后释放当前线程(线程可以去处理其他待执行的任务,比如UI事件、其他API调用)
    2. 当数据库查询完成、结果转换成数组后,await会触发上下文恢复,回到当前方法继续完成stuff的赋值操作
    3. 最后执行Console.WriteLine("Beep")

直观时序对比(假设存在其他待处理任务)

时间节点同步版本行为异步版本行为
T1启动ToArray(),线程进入阻塞状态调用ToArrayAsync()发起查询,线程被释放去处理其他任务
T2-Tn线程持续阻塞,等待数据库返回结果线程在处理其他任务(例:响应前端请求、处理UI点击)
Tn+1接收数据库结果,创建数组并赋值数据库查询完成,await恢复上下文,完成数组赋值
Tn+2打印"Boop"打印"Beep"

注意:如果没有其他待处理任务,异步版本的最终输出顺序看起来和同步版本一致,但底层线程的利用逻辑完全不同——异步不会浪费线程资源在等待IO操作上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:10:19