如何安全地处理使用 await foreach 检索到的 IAsyncDisposable 对象?

How to safely dispose of IAsyncDisposable objects retrieved with await foreach?

我可以使用 using var:

await foreach (var response in _container.GetItemQueryStreamIterator(query))
{
   using var safeResponse = response;
   //use the safeResponse
}

或者我应该这样做:

await foreach (var response in _container.GetItemQueryStreamIterator(query))
{ 
  try {
    //use response
  } finally {
    response?.Dispose();
  }
}

或者我可以 不处理因为迭代器是 IAsyncDisposableawait foreach 会为我做吗?

await foreach (var response in _container.GetItemQueryStreamIterator(query))
{
   //use the response
}

给定一个 IEnumerable<IDisposable>(其中有或没有 Async),没有关于谁应该处置这些元素的规则。因此,(并希望)枚举它不会处理它的元素。

处理元素是你的责任。

在你的问题中,你想要迭代处理它们,所以选项 3 是不可能的,你必须自己处理它们。

选项 1 和 2 是等价的,但都是臭的。

你可以写:

await foreach (var item in enumerable)
{
  await using (item)
  {
    ..          
  }
}

// by playing with your autoformatter
await foreach (var item in enumerable) await using (item)
{
  ..
}

遗憾的是我没有看到任何更好的解决方案。 it looks like 如果您使用 ValueType,则必须小心。 也许我们应该要求这样的东西:

await foreach(await using var e in c)

编辑当然somebody already ask for it