gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:32:37 27 4
gpt4 key购买 nike

我可以使用 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)

编辑 当然 somebody already ask for it .

关于c# - 如何安全地处理使用 await foreach 检索到的 IAsyncDisposable 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60001326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com