如何安全地处理使用 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();
}
}
或者我可以 不处理因为迭代器是 IAsyncDisposable
而 await 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)
我可以使用 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();
}
}
或者我可以 不处理因为迭代器是 IAsyncDisposable
而 await 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)