【发布时间】:2018-03-08 02:52:42
【问题描述】:
我有一个异步方法,比如说:
public async Task<T> GetAsync()
{
}
并且将从以下位置调用:
public async Task<IEnumerable<T>> GetAllAsync()
{
foreach (var item in something)
{
var result = await GetAsync();
yield return result;
}
}
上述语法无效,但基本上我是在使用异步生成器。我知道它可以通过 Observables 处理。我确实对 Rx.NET 进行了实验,它在一定程度上起作用。但我试图避免它给代码库带来的复杂性,更重要的是,上述要求本质上仍然不是一个反应式系统(我们的仍然是基于拉的)。例如我只会在一段时间内收听传入的异步流,并且我必须从消费者端停止生产者(而不仅仅是取消订阅消费者)。
我可以像这样反转方法签名:
public IEnumerable<Task<T>> GetAllAsync()
但这使得在不阻塞的情况下执行 LINQ 操作有点棘手。我希望它是非阻塞的,并且不将整个东西加载到内存中。这个库:AsyncEnumerable 完全符合我的要求,但Ix.NET 怎么能做到这一点?我相信它们的目的是相同的。
也就是说,在处理await 时,如何利用Ix.NET 生成IAsyncEnumerable?喜欢,
public async IAsyncEnumerable GetAllAsync()
{
foreach (var item in something)
{
var result = await GetAsync();
return // what?
}
}
【问题讨论】:
-
在这里为 Ix.NET 找到了一个扩展库,可以帮助我解决这个问题:github.com/CXuesong/AsyncEnumerableExtensions
标签: c# linq lazy-evaluation rx.net system.interactive