【发布时间】:2020-05-14 07:59:45
【问题描述】:
我们最近将使用 Dapper 的 ASP.NET Core API 迁移到 .NET Core 3.1。迁移后,我们觉得有机会将 C# 8 的最新 IAsyncEnumerable 功能用于我们的一个端点。
这是修改前的伪代码:
public async Task<IEnumerable<Item>> GetItems(int id)
{
var reader = await _connection.QueryMultipleAsync(getItemsSql,
param: new
{
Id = id
});
var idFromDb = (await reader.ReadAsync<int?>().ConfigureAwait(false)).SingleOrDefault();
if (idFromDb == null)
{
return null;
}
var items = await reader.ReadAsync<Item>(buffered: false).ConfigureAwait(false);
return Stream(reader, items);
}
private IEnumerable<Item> Stream(SqlMapper.GridReader reader, IEnumerable<Item> items)
{
using (reader)
{
foreach (var item in items)
{
yield return item;
}
}
}
IAsyncEnumerable 代码更改后:
// Import Nuget pacakage: System.Linq.Async
public async Task<IAsyncEnumerable<Item>> GetItems(int id)
{
var reader = await _connection.QueryMultipleAsync(getItemsSql,
param: new
{
Id = id
});
var idFromDb = (await reader.ReadAsync<int?>().ConfigureAwait(false)).SingleOrDefault();
if (idFromDb == null)
{
return null;
}
var items = await reader.ReadAsync<Item>(buffered: false).ConfigureAwait(false);
return Stream(reader, items);
}
private IAsyncEnumerable<Item> Stream(SqlMapper.GridReader reader, IEnumerable<Item> items)
{
using (reader)
{
await foreach (var item in items.ToAsyncEnumerable())
{
yield return item;
}
}
}
上述方法是使用ToAsyncEnumerable 的灵感来自this post,但我不能100% 确定我是否在正确的地方/上下文中使用它。
问题:
- dapper 库只返回
IEnumerable,但我们可以使用ToAsyncEnumerable将其转换为IAsyncEnumerableforasyncstream像上面一样吗?
注意:这个问题与What happens with returning IEnumerable if used with async/await (streaming data from SQL Server with Dapper)? 类似,但我认为这不能回答我的问题。
【问题讨论】:
-
如果 dapper 不暴露
IAsyncEnumerable<T>API,你希望通过包装IEnumerable<T>API 获得什么? -
像这样包裹
IAsyncEnumerable,你将获得nothing。IAsyncEnumerable允许您在值到达时返回它们。但是,您的代码所做的是检索所有内容,然后使用虚假的异步操作将其返回。客户认为他们很快就会得到结果,但实际上他们必须像以前一样等待 -
嗨@abatishchev,谢谢你这么说。这种情况发生了很多次,以至于我不再问为什么我被否决了。我会花 15 分钟到半小时来提出问题,有时我会在几分钟内被否决。猜猜,否决票的定义不是很清楚。对我来说,如果一个问题格式正确且精确,如果不赞成,则可能不值得反对。
-
@AnkitVijay:干杯!由于某种原因,评论被删除(被版主?)。搞砸这个。
-
嗨@svw,如果这个问题是你搜索结果的顶部,它只是表明网络上没有太多关于这个主题的信息。您如何期望有人在这种情况下进行更多研究?我认为假设在问题发布到 SO 之前没有进行任何研究是错误的。我相信您会同意,提出一个问题以获得社区的良好响应是一项相当大的努力。无论如何,downvotes 并没有真正困扰我了。 :)
标签: c# async-await dapper iasyncenumerable