仅读取 IAsyncEnumerable 中的第一项,然后取消

问题描述 投票:0回答:2

当使用

IAsyncEnumerable<T>
时,是否可以只从流中读取第一项,然后取消操作并返回它?类似于
FirstOrDefault
上的
IEnumerable<T>

干杯

c# .net linq asynchronous iasyncenumerable
2个回答
8
投票

请参阅此 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;
}

8
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.