c# - 如何安全地处理使用 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
}
解决方案
给定一个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)
编辑当然已经有人要求了。
推荐阅读
- asp.net - 我如何在 asp.net c# 3.5 中实现这种 excel 格式
- node.js - Node js直播rtsp摄像头
- php - Woocommerce 订阅:为购物车中的每个项目分配不同的 subscrption_id
- vba - 使用 vb 脚本将 utf16le 文本文件转换为 utf-8 文本文件
- spring - 为 Open Api v3 使用 @Schema 注释
- go - 为什么 atomic.Value 一定不能在第一个 Store 之后复制?
- javascript - NodeJS 条目等待完成每个元素
- angular - Angular Mock Test - 服务的异步调用
- docker - 尝试连接到另一个 docker 容器中的 rabbitmq 时出现“无法解析代理主机名”
- vba - 用于在区域的第一个空列中导入文本数据的 VBA 脚本