await Task.CompletedTask 是否意味着异步方法将同步运行?

Sco*_*.Hu 5 c# task async-await

static async Task WaitTaskCompleted()
{
    //Use Thread A before await Task.CompletedTask
    await Task.CompletedTask;
    //Will the code after await Task.CompletedTask always use Thread A, or there is chance to have a Thread B?
}
Run Code Online (Sandbox Code Playgroud)

这意味着await Task.CompletedTask将始终实际同步执行该方法?

Mar*_*ell 14

是的,这段代码将始终同步运行;主延续编译器 goo 仅在遇到第一个不完整的awaitable时才会调用。

您可以在sharplab中看到这一点- 特别是在这里:

awaiter = Task.CompletedTask.GetAwaiter();
if (!awaiter.IsCompleted)
{
    num = (<>1__state = 0);
    <>u__1 = awaiter;
    <>t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref this);
    return;
}
Run Code Online (Sandbox Code Playgroud)

它是实现异步性的AwaitUnsafeOnCompleted(...)+ return