【发布时间】:2020-02-17 08:20:00
【问题描述】:
public async IAsyncEnumerable<Entity> FindByIds(List<string> ids)
{
List<List<string>> splitIdsList = ids.Split(5);
var entityList = splitIdsList.Select(x => FindByIdsQuery(x)).ToList();
foreach (var entities in entityList)
{
await foreach (var entity in entities)
{
yield return entity;
}
}
}
private async IAsyncEnumerable<Entity> FindByIdsQuery(List<string> ids)
{
var result = await Connection.QueryAsync(query, new {ids})
foreach (var entity in result)
{
yield return entity;
}
}
如果我向这个函数发送 25 个 ID。第一个 FindByIdsQuery 需要 5000 毫秒。其他 4 个 FindByIdsQuery 需要 100 毫秒。然后这个解决方案不会输出任何实体,直到 5000 毫秒之后。是否有任何解决方案可以在有任何人输出时立即开始输出实体。或者,如果您可以在 Task 中执行类似操作,请使用 Task.WhenAny。
明确一点:5 个查询中的任何一个都可能需要 5000 毫秒。
【问题讨论】:
-
List<T>.Split()?是错字吗? -
抱歉,我忘了包含拆分代码。但不,它分成 5 个 id 的块。
-
Split方法的签名是什么?在不知道签名的情况下,我们无法解析splitIdsList变量的类型,因为它被声明为var。 -
@TheodorZoulias 你说的很对!我现在更容易理解 split 的作用了!
标签: c# .net .net-core iasyncenumerable