我有这个简单的代码:
public async Task<string> GetAsync()
{
var httpClient = new HttpClient();
return await httpClient.GetStringAsync("...");
}
但是瑞沙珀说:
当我使用变量时,此警告消失了:
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为什么警告我?
答案 0 :(得分:0)
您的方法“可以”被重写如下:
public Task<string> GetAsync()
{
var httpClient = new HttpClient();
return httpClient.GetStringAsync("...");
}
从而避免了编译async
方法并随后使用await
进行昂贵的控制流切换的开销。功能仍然相同。这就是R#告诉您的信息-您可以省略async/await
并避免不必要的开销。
但是,由于您的代码很臭,因此我将“ can”用引号引起来,因为首先HttpClient
是IDisposable
,因此您应在使用后将其丢弃。然后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 post和this SE Stack Exchange post。