我有一个异步方法,比如说:
public async Task<T> GetAsync()
{
}
并且将从以下位置被调用:
public async Task<IEnumerable<T>> GetAllAsync()
{
foreach (var item in something)
{
var result = await GetAsync();
yield return result;
}
}
上述语法不是有效的,但我实际上是在寻找异步生成器。我知道它可以通过Observable进行处理。我尝试过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?
}
}