博主头像

ワクワク

C# 同步执行 vs 异步执行 方法区别

同步执行 vs 异步执行

没有 await 的 async 方法:
    如果一个 async 方法中没有任何 await 表达式(即没有实际的异步操作),那么该方法将同步执行,直到完成。尽管如此,它仍然会返回一个 Task 对象(对于返回类型为 void 以外的情况)。这个 Task 对象会被立即标记为已完成,并且它的结果(如果有)也会立即可用。
    这种情况下,虽然使用了 async 关键字来定义方法,但因为缺乏异步点(await),所以不会涉及到状态机或异步调用的实际机制。

包含 await 的 async 方法:
    当 async 方法中包含 await 表达式时,情况就变得不同了。当执行到 await 表达式时,如果被等待的任务还未完成,那么该方法将会在这个点暂停,并返回控制权给其调用方。此时,方法的执行并未完成,因此返回的是一个未完成的 Task。
    编译器会为此类方法生成一个状态机,用于管理方法在遇到 await 时的状态和恢复逻辑。这意味着方法可以在暂停后从上次离开的地方继续执行,而不需要重新开始整个方法的执行。
    此外,await 的作用不仅是等待任务完成,还可以指定是否需要在线程恢复时回到原始上下文(例如UI线程)。这是通过检查并使用当前的 SynchronizationContext 来实现的,默认情况下,await 会尝试捕获并恢复到原来的上下文中。

以下面的方法为例说明一下,方法的具体执行流程以及线程阻塞的原因:

    private void Button_Click(object sender, RoutedEventArgs e)
{
    var res = HeavyJob().Result; // 阻塞UI线程
    txt.Text = res.ToString();
}
 
private async Task<int> HeavyJob()
{
    Debug.WriteLine($"Thread Id: {Environment.CurrentManagedThreadId}");
    await Task.Delay(2000);  // ← 异步等待点
    return 1;
}

2025-12-09T01:55:30.png
2025-12-09T01:55:30.png

C# 同步执行 vs 异步执行 方法区别
https://zm-myoas.net.cn/index.php/archives/4/
本文作者 youngstone
发布时间 2025-12-09
许可协议 CC BY-NC-SA 4.0
发表新评论