如何将 Task<IEnumerable<T>>“调整”为 IAsyncEnumerable<T>?

Kev*_*son 8 .net c# system.reactive system.interactive

我正在逐步将 Ix.NET 引入到遗留项目中。我有许多返回 的存储级 API Task<IEnumerable<T>>,但我想调整它们以IAsyncEnumerable<T>供系统其余部分使用。似乎应该有一个辅助方法(.ToAsyncEnumerable()IEnumerable 的ala)来帮助解决这个问题,但我找不到任何东西......我是否必须实现自己的自定义枚举器?(不难,但我不想重新发明轮子)

小智 8

Task<IEnumerable<T>> GetSomeResults<T>()
{
    throw new NotImplementedException();
}

async IAsyncEnumerable<T> GetAsyncEnumerable<T>()
{
    var results = await GetSomeResults<T>();
    foreach(var item in results)
    {
        yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)


Bre*_*ett 7

正如Theodor Zoulias所评论的, System.Linq.Async.NET Foundation的一个 NuGet 包,它支持ToAsyncEnumerable().

用法示例:

    var tasks = new Task[0]; // get your IEnumerable<Task>s
    tasks.ToAsyncEnumerable();
Run Code Online (Sandbox Code Playgroud)


Pau*_*ado 1

如果您谈论的是 Web API,Task<IEnumerable<T>>则是一种生成IEnumerable<T>.

无论是IEnumerable<T>同步还是异步生成,整个列表都将作为 HTTP 响应发送。

您可以利用客户端的方式IAsyncEnumerable<T>是,客户端正在调用某种流式传输或向服务器发出多个请求以获得唯一的结果列表(分页)。