异步方法调用是否应该在所有方法调用范围内链接起来?

3

我正在编写一个asp.net core web API,它正在消费另一个第三方API,并向调用者(即客户端Web浏览器)返回一些JSON响应。当我以异步方式编写我的实现时,Visual Studio建议从以下异步方法中删除async await。

我只是想澄清一下,我不需要将这两个方法包装在async await中吗?

以下是方法:

public async Task<T> GetAsync<T>(string url)
{
    return  await GetResponse<T>(HttpMethod.GET,url);
}

public async Task<T> PostAsync<T>(string url, object payload)
{
    return await GetResponse<T>(HttpMethod.POST, url,payload);       
}

以下是被上述两种方法调用的方法:
public async Task<T> GetResponse<T>(HttpMethod method,string url, object payload = null)
{
    System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();

    HttpResponseMessage response;

    switch (method)
    {
        case HttpMethod.POST:
        {
            var content = new StringContent(payload.ToString(), Encoding.UTF8, "application/json");
            response = await client.PostAsync(url, content).ConfigureAwait(false);
            break;
        }
        case HttpMethod.GET:
        default:
            method = HttpMethod.GET;
            response = await client.GetAsync(url).ConfigureAwait(false);
            break;
    }


   var responseMessageString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

   _logger.LogInformation($"{method.ToString()} {method.ToString()} {Environment.NewLine} Response: {responseMessageString}");

    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseMessageString);
}

以下是来自Visual Studio的建议:

在此输入图片描述

方法声明中的异步和await可能会被省略。


3
省略 async/await 的优缺点。 - Johnathan Barclay
@Damien_The_Unbeliever,假设我们确实需要异常处理,那么怎么办? - Ehsan Sajjad
1
@EhsanSajjad 你不需要包装它们。由于这些方法(GetAsyncPostAsync)只是传递而没有其他方法在其中调用,因此您可以删除async-await并仅返回任务。 - Nkosi
1
@EhsanSajjad,没错。你应该查看上面Johnathan Barclay提供的文章链接。 - Nkosi
1
@EhsanSajjad 我在这个主题上总是参考这个参考资料 *Async/Await - Best Practices in Asynchronous Programming*。 - Nkosi
显示剩余3条评论
1个回答

5

我只是想澄清一下,我不需要在这两个方法中使用async await吗?

没错。你可以相信Visual Studio和ReSharper的建议,它们在建议方面非常保守。

在这种情况下,因为每个方法只是将参数传递给另一个方法并返回相同的内容,所以安全地省略asyncawait关键字

但是,我不认为你必须这样做。省略关键字会稍微提高性能,但如果这些方法执行任何非平凡的操作,或者在将来进行任何非平凡的更改,则需要保留async/await关键字。


谢谢@Stephen,但是你对于ConfigureAwait的建议有什么看法?在基于.NET Core的API中是否仍然需要它? - Ehsan Sajjad
2
@EhsanSajjad: 对于通用库,我仍然建议使用ConfigureAwait(false)。如果您正在使用ASP.NET Core,则无需使用它 - Stephen Cleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接