我可以在方法结束时安全地删除 await Task.CompletedTask 调用吗?

meJ*_*rew 1 c# async-await .net-core

我正在查看一些旧代码,我发现一个async方法在做一些async事情,最后调用await Task.CompletedTask;如下:

    public async Task SomeMethod()
    {
        //some code
        //...

        await _someService.DoStuffAsync();
        await Task.CompletedTask;
    }
Run Code Online (Sandbox Code Playgroud)

从我读到的内容来看,删除最后一行似乎是安全的,因为它对方法执行没有功能影响,因为Task.CompletedTask它将返回一个已经完成的任务,因此它不会等待它,但我对此有第二个想法.

删除最后一行是否安全?是多余的吗?

Wik*_*hla 5

是的,删除它是完全安全的。除了检查任务是否已完成之外,此调用不会执行任何操作。

多年前,当时async还没有,但是Task,我们必须有

public Task Something()
{
    ....

    return Task.FromResult(0);
}
Run Code Online (Sandbox Code Playgroud)

人们在Task.CompletedTask添加时采用了这个,你会经常看到

public Task Something()
{
    ....

    return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

如果....不执行任何异步操作但您仍然必须返回一个Task.

async可用且方法体awaits 时,该方法不必返回任何内容:

public async Task Something()
{
    await SomethingElse();        
}
Run Code Online (Sandbox Code Playgroud)

await荷兰国际集团的Task.CompletedTask-我不认为有这个地方将是有益的场景。