gpt4 book ai didi

c# - IAsyncEnumerable 用于永无止境的流

转载 作者:行者123 更新时间:2023-12-03 08:15:50 26 4
gpt4 key购买 nike

我正在构建一个客户端,用于持续使用数据源中的新记录。集成是基于拉取的,我的客户定期查询数据源以获取新记录。我使用 IAsyncEnumerable 作为这个连续的新记录流的返回类型。以下是该方法的要点:

public async IAsyncEnumerable<Record> StreamRecords(...)
{
while (!cancellationToken.IsCancellationRequested)
{
using var response = await _httpClient.SendAsync(request, cancellationToken);

var records = _parser.Parse(response.Content);

foreach (var r in records) yield return r;

await Task.Delay(waitPeriod, cancellationToken);
}
}

这是 IAsyncEnumerable 的正确使用吗?该流应该是“永不结束”或“连续”的(至少在cancelToken或错误之前)。

最佳答案

与大多数事情一样:关键是要清楚地传达意图和行为。我认为非结束序列没有概念问题,无论是 IEnumerable<T>IAsyncEnumerable<T> - 但显然如果消费者调用 ToList[Async]() ,事情将会很糟糕地结束。这本身并不是一个问题——给出一个类似的场景:一些I[Async]Enumerable<T>序列不可重复 - 要么它们只能迭代一次(后续尝试失败),要么每次产生不同的结果(甚至不需要诸如列表更改之类的事情)。这是完全合法的,但存在的代码假设序列是可重复的并且会产生相同的数据。这里也存在同样的讨论,最终,错的不是生产者,而是消费者。

所以:你的序列(生产者)将与一个理解数据应该被视为无界的合理消费者完美地配合。如果这就是您的应用程序所具有的,那么:太棒了!

关于c# - IAsyncEnumerable 用于永无止境的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69476957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com