首页 > 解决方案 > 如何安全地处理使用 await foreach 检索到的 IAsyncDisposable 对象?

问题描述

我可以这样做吗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();
  }
}

还是因为迭代器是 anIAsyncDisposable并且await foreach会为我做它,所以我可以不进行处理吗?

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

标签: c#c#-8.0iasyncenumerableiasyncdisposable

解决方案


给定一个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)
{
  ..
}

可悲的是,我没有看到任何更好的解决方案。如果您使用 ValueType,您似乎必须小心。也许我们应该要求这样的东西:

await foreach(await using var e in c)

编辑当然已经有人要求了


推荐阅读