问题标签 [iasyncenumerable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 将流处理为 IAsyncEnumerable - 流不可读
我有一个工作流程,我尝试执行以下操作:
- 一个接受回调的方法,它在内部产生 a
Stream
并且该方法的调用者可以使用回调来处理Stream
他们想要的任何方式 IAsyncEnumerable
在一种特殊情况下,调用者使用回调从 Stream中生成一个。
我在下面创建了一个最小的复制示例:
在这里,方法Test1
工作正常,而Test2
没有,失败Stream is not readable
。问题在于,在第二种情况下,当代码开始处理实际流时,流已经被释放了。
大概这两个示例之间的区别在于,对于第一个示例,读取流是在仍在一次性的上下文中执行的stream
,而在第二个示例中,我们已经退出了。
但是,我认为第二种情况也可能是有效的——至少我觉得它非常符合 C# 习惯。为了让第二个案例也能正常工作,我还有什么遗漏吗?
api - 使用 IAsyncEnumerable作为 ASP.NET Web API 中的 API 输出
新的 IAsyncEnumerable 接口很棒,但在通过 API 公开数据时会出现问题。
从Anthony Chu 的精彩帖子中获取代码,端点可以工作......直到您获得超过 8162 条记录...... IAsyncEnumerable 的缓冲区限制。
JsonSerialiser 试图在通过网络发送之前缓冲整个集合,而我希望它作为流发送。
管道中有一个修复程序(可能适用于 .NET 6.0 - 自 2021 年 4 月 7 日创建的 PR,请参阅参考资料)。问题线程(下面链接)中发布了一个解决方法,应该可以工作......但是......
- 什么是从 API 通过线路流式传输集合的当前最佳实践(根据 Anthony Chu 的说法,将 IAsyncEnumerable 转换为 IEnumerable 显然是不好的,因为它阻塞了当前线程
- 社区中是否有人为此找到了更好的解决方法?
触发问题的代码
使用 .NET 5.0 会出现以下错误:
System.InvalidOperationException: 'AsyncEnumerableReader' reached the configured maximum size of the buffer when enumerating a value of type 'IAsyncEnumerableSandbox.Controllers.TestController+<Get>d__2'. This limit is in place to prevent infinite streams of 'IAsyncEnumerable<>' from continuing indefinitely. If this is not a programming mistake, consider ways to reduce the collection size, or consider manually converting 'IAsyncEnumerableSandbox.Controllers.TestController+<Get>d__2' into a list rather than increasing the limit.
错误提示将 IAsyncEnumerable 转换为列表......但没有内置转换器。
参考
c# - 如何在丢弃结果时等待 IAsyncEnumerable
我有一个返回IAsyncEnumerable
. 我想await
完成它,但我不在乎任何结果。我只关心调用函数的副作用。
如何在不使用 for 循环或将其转换为容器(例如)的情况下轻松await
完成IAsyncEnumerable
for ToListAsync
?
c# - IAsyncEnumerator.Current 在未将枚举数集合强制转换为 List 时返回 null
第一个函数旨在使 linq 能够安全地并行执行 lambda 函数(甚至是 async void 函数)。
所以你可以做 collection.AsParallel().ForAllASync(async x => await x.Action)。
第二个函数旨在使您能够并行组合和执行多个 IAsyncEnumerables 并尽快返回它们的结果。
我有以下代码:
如果我从第二个函数中删除“ToList()”,尽管 enumerator.Item2(MoveNextAsync() 的结果)为真,但由于 enumerator.Item1.Current 往往为空,yield return 开始返回 null。
为什么?
c# - 结合 IAsyncEnumerator 并异步执行它们
第一个函数旨在使 linq 能够安全地并行执行 lambda 函数(甚至是 async void 函数)。
所以你可以做 collection.AsParallel().ForAllASync(async x => await x.Action)。
第二个函数旨在使您能够并行组合和执行多个 IAsyncEnumerables 并尽快返回它们的结果。
我有以下代码:
在迭代器到达末尾后,代码会以某种方式继续返回结果。
我正在使用这些函数来组合多个调用 API 端点的 IAsyncEnumerable 函数线程,但相同类型的结果除外。
为什么?
c# - 无法解析 System.Collections.Generic.IAsyncEnumerable 类型的服务
我有这个例外:
System.InvalidOperationException:“尝试激活“MyProject.Services.FooService”时,无法解析“System.Collections.Generic.IAsyncEnumerable`1[MyProject.Interfaces.IFooReader]”类型的服务。
在尝试解决IFooService
时var fooService = provider.GetRequiredService<IFooService>();
。
这是FooService
课程:
这是 DI 容器:
看起来本机 .net-core DI 容器不支持注入IAsyncEnumerable
,有什么办法解决这个问题?
c# - 如何批处理 IAsyncEnumerable,在连续批次之间执行最大间隔策略?
我有一个异步的消息序列(流),有时会多次到达,有时会偶尔到达,我想分批处理它们,每批 10 条消息。我还想对接收消息和处理消息之间的延迟实施上限,因此如果在接收到批处理的第一条消息后经过 5 秒,还应该处理少于 10 条消息的批处理。我发现我可以通过使用System.Interactive.Async包中的Buffer
运算符来解决问题的第一部分:
运营商签名Buffer
:
不幸的是,Buffer
运算符没有TimeSpan
参数过载,所以我不能这么容易地解决问题的第二部分。我必须自己实现一个带有计时器的批处理操作符。我的问题是:如何实现Buffer
具有以下签名的运算符的变体?
该timeSpan
参数应影响Buffer
操作员的行为,如下所示:
timeSpan
在发出前一批之后(或最初在调用方法之后)已经过去时,必须发出一个批次Buffer
。timeSpan
如果在发出前一个批次之后已经过去,并且在此期间没有收到任何消息,则必须发出一个空批次。- 比每个都更频繁地发出批次
timeSpan
意味着批次已满。在过去之前发出少于count
消息的批次timeSpan
是不可取的。
如果需要,我可以向我的项目添加外部依赖项,例如System.Interactive.Async或System.Linq.Async包。
PS这个问题的灵感来自最近一个与通道和内存泄漏有关的问题。
c# - 重用 IAsyncEnumerable 实例而无需再次迭代
我目前正在编写这样的方法:
正如你所看到的,我调用了await usersQuery.ExecuteQuery()
两次,并且ExecuteQuery()
是一种迭代我的数据库的方法,可以被认为是一个昂贵的操作。有什么办法可以IAsyncEnumerable<T>
像平时一样保存IEnumerable<T>
并在整个代码中重新使用它?
我考虑过使用ToListAsync()
它,但我不确定这是否被认为是好的做法。我还读到我可以返回 aTask<IAsyncEnumerable<T>>
并用它做点什么。处理这个问题的最佳方法是什么?我想实施最有效的解决方案。
c# - 将 GetAwaiter().GetResult() 与 ServiceBusReceiver.PeekMessagesAsync 一起使用时出现 System.InvalidOperationException
语境
我们使用GetAwaiter().GetResult()
是因为 PowerShellCmdlet.ProcessRecord()
不支持 async/await。
代码示例
问题
这里发生了什么?我们如何在不改变的情况下修复它GetMessages
?