【问题标题】:How to dispose an array of IDisposables returned by a task? [duplicate]如何处理任务返回的 IDisposables 数组? [复制]
【发布时间】:2021-02-11 10:02:25
【问题描述】:

我使用经验法则始终将实现 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("");

【问题讨论】:

标签: c# task-parallel-library using idisposable


【解决方案1】:

从 .net core 3 开始,可能并不总是需要在 http HttpResponseMessage 上调用 Dispose

简而言之,在大多数情况下,来自底层连接Socket的响应主体被完全接收,代表内容的字节数据将自动缓冲到MemoryStream中。在使用大多数 HttpClient API 重载(GetAsyncPostAsyncSendAsync)时会发生这种情况。

调用 dispose 只会释放不需要的底层MemoryStream但是,在某些情况下,情况并非如此,因此,如果您不完全了解发生了什么,请通过HttpResponseMessage 致电Dispose。在您的情况下,您有一个 HttpResponseMessage 列表,然后只需手动遍历列表

var responses = await Task.WhenAll(getResultTasks);

foreach(var response in response)
{
   // do something with the result maybe

   response?.Dispose();

   // job done
}

【讨论】:

  • 我读到 foreach 会自动处理(链接在最后)。顺便说一句,是否可以以某种方式使用 using 运算符,以便 IDisposable 自动处置csharpindepth.com/articles/…
猜你喜欢
  • 2016-08-19
  • 2011-11-21
  • 1970-01-01
  • 2020-08-17
  • 2011-08-17
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2011-10-11
相关资源
最近更新 更多