微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理任务返回的 IDisposable 数组?

如何解决如何处理任务返回的 IDisposable 数组?

我使用经验法则总是将实现 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(GetAsyncPostAsyncSendAsync)的大多数重载时会发生这种情况。

调用 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。