问题描述
我使用经验法则总是将实现 Idisposable 的所有内容放入 using 语句中。但是我开始使用 Tasks 并且我无法添加这样的 using 语句:
var getResultTasks = new List<Task<HttpResponseMessage>>();
getResultTasks.Add(_client.GetAsync(requestUri));
getResultTasks.Add(_client.GetAsync(requestUri));
using var httpGetResponseMessages = await Task.WhenAll(getResultTasks);
它说:
'HttpResponseMessage[]': 在 using 语句中使用的类型必须是 可隐式转换为“System.Idisposable”。
我可以毫无问题地将它应用到单个实例:
using var testing = await _client.GetAsync("");
解决方法
从 .net core 3 开始,可能并不总是需要在 http Dispose
上调用 HttpResponseMessage
。
简而言之,在大多数情况下,来自底层连接Socket的响应主体被完全接收,表示内容的字节数据将被自动缓冲到MemoryStream
.使用 HttpClient
API(GetAsync
、PostAsync
和 SendAsync
)的大多数重载时会发生这种情况。
调用 dispose 只会处理不需要的底层 MemoryStream
。 但是,有些情况并非如此,因此如果您不完全了解发生了什么,请在 Dispose
上调用 HttpResponseMessage
。在您的情况下,您有一个 HttpResponseMessage
列表,然后只需手动遍历列表
var responses = await Task.WhenAll(getResultTasks);
foreach(var response in response)
{
// do something with the result maybe
response?.Dispose();
// job done
}