在 C#中,当从Task
语句中返回Task<T>
或using
方法时,是否存在未正确发生清除的风险,或者是这是一个糟糕的做法?有什么问题,因为它涉及using
块中变量的关闭?
请考虑以下事项:
public Task<string> GetAsync(string url)
{
using (var client = new HttpClient())
{
return client.GetStringAsync(url);
}
}
在上面的示例中,异步操作由client.GetStringAsync(url)
表示,我只是将消费者的Task<string>
返回给await
。 client
中的using
会发生什么情况?是否会在等待或垃圾回收之前进行清理,还是会导致其他问题?
在这样的async
语句的原因中使用await
和using
会更好吗,如果是这样,为什么?
public async Task<string> GetAsync(string url)
{
string response = string.Empty;
using (var client = new HttpClient())
{
response = await client.GetStringAsync(url);
}
return response;
}
或
public async Task<string> GetAsync(string url)
{
using (var client = new HttpClient())
{
return await client.GetStringAsync(url);
}
}
有什么区别?
答案 0 :(得分:7)
使用第一种方法不起作用,client
将在完成其工作之前被处理掉,您必须使用第二版或第三版。
第2版和第3版之间没有实际差异,请根据您的团队风格使用。但是在第二个版本string response = string.Empty;
可以简化为string response;
如果所有代码路径都覆盖它而不读取它,则没有理由为变量赋值。