当使用
IAsyncEnumerable<T>
时,是否可以只从流中读取第一项,然后取消操作并返回它?类似于 FirstOrDefault
上的 IEnumerable<T>
?
干杯
请参阅此 Microsoft 教程,了解如何使用
IAsyncEnumerable<T>
。您可以获得 IAsyncEnumerator<T>
并使用它来获得第一个项目。
await using (var enumerator = myAsyncEnumerable.GetAsyncEnumerator()){
// If MoveNextAsync() returns false, the enumerator is empty.
var first = await enumerator.MoveNextAsync() ? enumerator.Current : default;
}
IAsyncEnumerable 上的 LINQ 运算符通过 System.Linq.Async 包提供。
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);