我正在逐步将 Ix.NET 引入到遗留项目中。我有许多返回的存储级 API Task<IEnumerable<T>>
,但我想调整它们以IAsyncEnumerable<T>
在系统的其余部分中使用。似乎应该有一个辅助方法(.ToAsyncEnumerable()
IEnumerable 的ala)来帮助解决这个问题,但我找不到任何东西......我是否必须实现自己的自定义枚举器?(不难,但我不想重新发明轮子)
问问题
2404 次
3 回答
5
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;
}
}
于 2021-03-20T07:29:23.833 回答
1
我一直在寻找完全相同的东西,由于这里的回复,我认为确实没有像AsAsyncEnumerable()
. 所以这就是我最终做的事情,也许它对其他人有帮助:
public static class AsyncEnumerableExtensions {
public struct AsyncEnumerable<T> : IAsyncEnumerable<T> {
private readonly IEnumerable<T> enumerable;
public AsyncEnumerable(IEnumerable<T> enumerable) {
this.enumerable = enumerable;
}
public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = new CancellationToken()) {
return new AsyncEnumerator<T>(enumerable?.GetEnumerator());
}
}
public struct AsyncEnumerator<T> : IAsyncEnumerator<T> {
private readonly IEnumerator<T> enumerator;
public AsyncEnumerator(IEnumerator<T> enumerator) {
this.enumerator = enumerator;
}
public ValueTask DisposeAsync() {
enumerator?.Dispose();
return default;
}
public ValueTask<bool> MoveNextAsync() {
return new ValueTask<bool>(enumerator == null ? false : enumerator.MoveNext());
}
public T Current => enumerator.Current;
}
public static AsyncEnumerable<T> AsAsyncEnumerable<T>(this IEnumerable<T> that) {
return new AsyncEnumerable<T>(that);
}
public static AsyncEnumerator<T> AsAsyncEnumerator<T>(this IEnumerator<T> that) {
return new AsyncEnumerator<T>(that);
}
}
于 2021-06-16T12:09:27.343 回答
0
如果您谈论的是 Web API,Task<IEnumerable<T>>
它是一种生成IEnumerable<T>
.
无论是IEnumerable<T>
同步还是异步生成,整个列表都将作为 HTTP 响应发送。
您可以利用IAsyncEnumerable<T>
客户端的方式是,如果该客户端正在调用某种流式传输或向服务器发出多个请求以获取唯一的结果列表(分页)。
于 2019-03-31T21:05:55.950 回答