当消费IAsyncEnumerable<T>
时,是否可以只从流中读取第一项,然后取消操作并返回它?就像IEnumerable<T>
号的FirstOrDefault
号?
干杯
当消费IAsyncEnumerable<T>
时,是否可以只从流中读取第一项,然后取消操作并返回它?就像IEnumerable<T>
号的FirstOrDefault
号?
干杯
通过System.Linq.Async包提供了IAsyncEnumerable上的LINQ运算符.
var discount=await priceStream.FirstOrDefaultAsync(it=>it.Price<cutoff);
不过,还是要小心.对于异步流,在流本身关闭或取消等待之前,您不知道是否有匹配的元素.匹配的项目可能在10秒内出现,也可能在1天内出现,也可能永远不出现.这就是为什么你通常也需要传递一个取消令牌,这样你就可以在一段时间后停止等待:
var cts=new CancellationSource(TimeSpan.FromMinutes(1));
var discount=await priceStream.FirstOrDefaultAsync(
it=>it.Price<cutoff,
cts.Token);
System.Linq.Async
操作符还允许使用异步谓词:
var discount=await priceStream.FirstOrDefaultAsync(
async it => await service.IsGoodOfferAsync(it),
cts.Token);