嵌套异步方法...我需要等待吗?

Joe*_*orn 1 c# async-await

假设我有一个现有async方法返回运行良好的任务。它在等待,而且它本身也被正确地等待着。该方法接受一个int参数:

public async Task<MyType> MyMethod(int foo)
{
    // .. do stuff 
}
Run Code Online (Sandbox Code Playgroud)

我们想要更新这个方法来接受一个字符串,如果我们可以从字符串中解析一个 int,那么就做我们一直在做的事情(移动到一个新的辅助方法),否则,如果我们可以解析一个 Guid,那么调用不同的(但非常相似)的方法。如果两种类型都无法解析,则返回空/noop 结果:

public async Task<MyType> MyMethod(string foo)
{
    if ( int.TryParse(foo, out int bar))
    {
        return MyIntHelper(bar);
    }
    else if (Guid.TryParse(foo, out Guid bar))
    {
        return MyGuidHelper(bar);
    }
    else return MyNoop();
}

private async Task<MyType> MyIntHelper(int foo)
{
    // original ".. do stuff" here
}

private async Task<MyType> MyGuidHelper(Guid foo)
{
    // similar ".. do stuff" here, but using a Guid instead
}
Run Code Online (Sandbox Code Playgroud)

问题是,在更新后MyMethod(),我是否需要await辅助方法的结果,或者因为我已经返回了一个任务并且任何必要的等待仍在调用者和子方法中,我是否已经涵盖了?

作为一些背景,这是在更新控制器以接受额外的“端点”的背景下,但实际上我想尽可能地将问题与该上下文分离。

Ste*_*ary 5

在更新的 MyMethod() 中,我是否需要等待辅助方法的结果

如果你使用async,那么你应该使用await。作为一般规则,对于大多数异步方法,您应该使用asyncand 。await

任何时候你有重要的逻辑(包括异常的可能性),你应该使用asyncand await。对于简单的方法实现,您可以省略asyncandawait(如我的博客中所述)。