异步和等待可能被消除?

时间:2019-07-09 07:18:24

标签: c# async-await resharper

我有这个简单的代码:

 public async  Task<string> GetAsync()
   {
      var httpClient = new HttpClient();
      return await httpClient.GetStringAsync("...");
   }

但是瑞沙珀说:

enter image description here

当我使用变量时,此警告消失了:

 public async  Task<string> GetAsync()
        {
            var httpClient = new HttpClient();
            var st = await  httpClient.GetStringAsync("...");
            return st;
        }

我已经知道这样做的危险

 using (var httpClient = new HttpClient())
 return  httpClient.GetStringAsync("...");

(任务将被取消)

但这不是我的情况,因为我正在使用await(而不是使用using)。

问题:

Resharper为什么警告我?

1 个答案:

答案 0 :(得分:0)

您的方法“可以”被重写如下:

public Task<string> GetAsync()
{
    var httpClient = new HttpClient();
    return httpClient.GetStringAsync("...");
}

从而避免了编译async方法并随后使用await进行昂贵的控制流切换的开销。功能仍然相同。这就是R#告诉您的信息-您可以省略async/await并避免不必要的开销。

但是,由于您的代码很臭,因此我将“ can”用引号引起来,因为首先HttpClientIDisposable,因此您应在使用后将其丢弃。然后async/await是必要的:

public async Task<string> GetAsync()
{
    using(var httpClient = new HttpClient())
    {
        return await httpClient.GetStringAsync("...");
    }
}

因为它将被翻译成等价物

public async Task<string> GetAsync()
{
    var httpClient = new HttpClient();
    var result = await httpClient.GetStringAsync("...");
    httpClient.Dispose();
    return result;
}

您绝对应该修复此问题。其次,要考虑的一件事是,创建HttpClient可以静默破坏您的应用程序的稳定性,因为HttpClient应该被重用。参见this blog postthis SE Stack Exchange post