异步流——对异步流使用LINQ
问题
假设要使用经过妥善定义以及完善测试的运算符,来处理异步流。
解决方案
IEnumerable<T>具有LINQ to Objects,而IObservable<T>具有LINQ to Events.两者都有扩展方法库。IAsyncEnumerable<T>也具备LINQ支持,包含于Asystem.Linq.Async NuGet包中
IAsyncEnumerable<int> values=SlowRange().WhereAwait(
async value=>{
//执行某些异步操作
await Task.Delay(10);
return value%2 ==0;
}
);
await foreach(int result in values)
{
Console.WriteLine(result);
}
async IAsyncEnumerable<int> SlowRange()
{
for(int i=0;i!=10;i++)
{
await Task.Delay(i*100);
yield return i;
}
}
讨论
因为异步流基于拉式模型,所以他不像可观察对象那样具有与时间相关的运算符,在一不留种,Throttle和Sample并没有实际意义,这是因为元素是按需从异步流中拉取出来的。
可以对任意的IEnumerable<T>调用ToAsyncEnumerable(),然后便可以在异步流接口中使用WhereAwait、SelectAwait以及其他支持异步流委托的运算符。