温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - How to safely dispose of IAsyncDisposable objects retrieved with await foreach?
c# c#-8.0 iasyncenumerable iasyncdisposable

c# - 如何安全地处置通过await foreach检索到的IAsyncDisposable对象?

发布于 2020-03-28 23:29:04

我可以使用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事情,因为迭代器是an,而will为我做呢?

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

查看更多

查看更多

提问者
fred_
被浏览
37
Orace 2020-01-31 18:29

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

当然编辑已经有人要了