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

Ehs*_*jad 3 c# async-await asp.net-core asp.net-core-2.2 .net-core-3.1

我正在编写一个 asp.net 核心 Web API,它使用另一个第三方 API 并将一些 JSON 响应返回给调用者,调用者将成为客户端 Web 浏览器。在以异步方式编写我的实现时,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);       
}
Run Code Online (Sandbox Code Playgroud)

以下是上述两种方法消耗的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

以下是 Visual Studio 的建议:

在此处输入图片说明

方法声明中的异步和等待可能会被省略

Ste*_*ary 5

我只是想澄清一下,我不需要将这两个方法包装在异步等待中?

那是正确的。您可以信任 Visual Studio 和 ReSharper 提出的建议;他们的建议非常保守。

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

但是,我不认为您必须这样做。消除关键字可以让您(非常)轻微地提高性能。但是,如果这些方法做了任何重要的事情——或者在未来被改变以做任何重要的事情——那么你会想要保留async/await关键字。

  • @EhsanSajjad:我仍然推荐通用库使用“ConfigureAwait(false)”。如果您使用 ASP.NET Core,那么[您不需要使用它](https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html)。 (2认同)