嵌套async/await方法

Bri*_*nga 15 c# async-await c#-5.0

我正在编写一个包含第三方Web服务调用的库,并且正在尝试使库使用新的async/await功能.在以下示例中,async/await关键字的正确用法是什么?

public class MyApi
{
    public Task<ApiResult> DoSomethingAsync()
    {
        return this.DoSomethingCore();
    }

    public async Task<ApiResult> DoSomethingElseAsync()
    {
        return await this.DoSomethingCore();
    }

    private async Task<ApiResult> DoSomethingCore()
    {
        var httpClient = new HttpClient();
        var httpResponseMessage = await httpClient.GetAsync("some url");
        var rawResultText = await httpResponseMessage.Content.ReadAsStringAsync();
        return new ApiResult(rawResultText);        
    }
}
Run Code Online (Sandbox Code Playgroud)

为了让我的调用者等待DoSomethingAsync方法,该方法是否还要添加async和await关键字?或者它是否正常,因为它返回一个任务?这种嵌套有更好的模式吗?

我认为DoSomethingAsync方法是正确的方法,这是正确的吗?我相信DoSomethingElseAsync在构建库时似乎是错误的方法.

Ste*_*ary 12

任何人Task都可以等待,无论它来自哪里.

我不确定为什么DoSomethingAsync只是打电话DoSomethingCore,因为DoSomethingAsync可以很容易async和使用await.

还有一个一般的规则,你应该使用ConfigureAwait(false)在库方法.

编辑:如果您不需要使用await,则不要制作该方法async.async将增加一些开销(检查ChannelT for Stephen Toub的Zen of Async Performance视频).如果你可以返回Task(像DoSomethingAsync),那就这样做.

  • @Sonic:`Async` 后缀是一个约定,它表明它被设计为由 `await` *消耗*,而不是它是用 `await` *实现的。所以即使`DoSomethingElseAsync` 不使用`async`/`await`,它仍然应该使用`Async` 后缀。 (2认同)