问题标签 [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.

0 投票
2 回答
90 浏览

c# - 为什么将返回 IAsyncEnumerable 的异步方法实现为类而不是结构?

我很好奇为什么异步方法将IAsyncEnumerable编译返回到状态机,该状态机被定义为类而不是通常的结构。请参见以下示例:

Sharplab.io

Sharplab.io

0 投票
1 回答
484 浏览

c# - 将流处理为 IAsyncEnumerable - 流不可读

我有一个工作流程,我尝试执行以下操作:

  • 一个接受回调的方法,它在内部产生 aStream并且该方法的调用者可以使用回调来处理Stream他们想要的任何方式
  • IAsyncEnumerable在一种特殊情况下,调用者使用回调从 Stream中生成一个。

我在下面创建了一个最小的复制示例:

在这里,方法Test1工作正常,而Test2没有,失败Stream is not readable。问题在于,在第二种情况下,当代码开始处理实际流时,流已经被释放了。

大概这两个示例之间的区别在于,对于第一个示例,读取流是在仍在一次性的上下文中执行的stream,而在第二个示例中,我们已经退出了。

但是,我认为第二种情况也可能是有效的——至少我觉得它非常符合 C# 习惯。为了让第二个案例也能正常工作,我还有什么遗漏吗?

0 投票
0 回答
146 浏览

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 转换为列表......但没有内置转换器。

参考

相关问题:澄清 IAsyncEnumerable 如何与 ASP.NET Web API 一起使用

0 投票
2 回答
164 浏览

c# - 如何在丢弃结果时等待 IAsyncEnumerable

我有一个返回IAsyncEnumerable. 我想await完成它,但我不在乎任何结果。我只关心调用函数的副作用。

如何在不使用 for 循环或将其转换为容器(例如)的情况下轻松await完成IAsyncEnumerablefor ToListAsync

0 投票
1 回答
163 浏览

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。

为什么?

0 投票
1 回答
174 浏览

c# - 结合 IAsyncEnumerator 并异步执行它们

第一个函数旨在使 linq 能够安全地并行执行 lambda 函数(甚至是 async void 函数)。

所以你可以做 collection.AsParallel().ForAllASync(async x => await x.Action)。

第二个函数旨在使您能够并行组合和执行多个 IAsyncEnumerables 并尽快返回它们的结果。

我有以下代码:

在迭代器到达末尾后,代码会以某种方式继续返回结果。

我正在使用这些函数来组合多个调用 API 端点的 IAsyncEnumerable 函数线程,但相同类型的结果除外。

为什么?

0 投票
1 回答
239 浏览

c# - 无法解析 System.Collections.Generic.IAsyncEnumerable 类型的服务

我有这个例外:

System.InvalidOperationException:“尝试激活“MyProject.Services.FooService”时,无法解析“System.Collections.Generic.IAsyncEnumerable`1[MyProject.Interfaces.IFooReader]”类型的服务。

在尝试解决IFooServicevar fooService = provider.GetRequiredService<IFooService>();

这是FooService课程:

这是 DI 容器:

看起来本机 .net-core DI 容器不支持注入IAsyncEnumerable,有什么办法解决这个问题?

0 投票
2 回答
780 浏览

c# - 如何批处理 IAsyncEnumerable,在连续批次之间执行最大间隔策略?

我有一个异步的消息序列(流),有时会多次到达,有时会偶尔到达,我想分批处理它们,每批 10 条消息。我还想对接收消息和处理消息之间的延迟实施上限,因此如果在接收到批处理的第一条消息后经过 5 秒,还应该处理少于 10 条消息的批处理。我发现我可以通过使用System.Interactive.Async包中的Buffer运算符来解决问题的第一部分:

运营商签名Buffer

不幸的是,Buffer运算符没有TimeSpan参数过载,所以我不能这么容易地解决问题的第二部分。我必须自己实现一个带有计时器的批处理操作符。我的问题是:如何实现Buffer具有以下签名的运算符的变体?

timeSpan参数应影响Buffer操作员的行为,如下所示:

  1. timeSpan在发出前一批之后(或最初在调用方法之后)已经过去时,必须发出一个批次Buffer
  2. timeSpan如果在发出前一个批次之后已经过去,并且在此期间没有收到任何消息,则必须发出一个空批次。
  3. 比每个都更频繁地发出批次timeSpan意味着批次已满。在过去之前发出少于count消息的批次timeSpan是不可取的。

如果需要,我可以向我的项目添加外部依赖项,例如System.Interactive.AsyncSystem.Linq.Async包。

PS这个问题的灵感来自最近一个与通道和内存泄漏有关的问题。

0 投票
2 回答
149 浏览

c# - 重用 IAsyncEnumerable 实例而无需再次迭代

我目前正在编写这样的方法:

正如你所看到的,我调用了await usersQuery.ExecuteQuery()两次,并且ExecuteQuery()是一种迭代我的数据库的方法,可以被认为是一个昂贵的操作。有什么办法可以IAsyncEnumerable<T>像平时一样保存IEnumerable<T>并在整个代码中重新使用它?

我考虑过使用ToListAsync()它,但我不确定这是否被认为是好的做法。我还读到我可以返回 aTask<IAsyncEnumerable<T>>并用它做点什么。处理这个问题的最佳方法是什么?我想实施最有效的解决方案。

0 投票
2 回答
125 浏览

c# - 将 GetAwaiter().GetResult() 与 ServiceBusReceiver.PeekMessagesAsync 一起使用时出现 System.InvalidOperationException

语境

我们使用GetAwaiter().GetResult()是因为 PowerShellCmdlet.ProcessRecord()不支持 async/await。

代码示例

问题

这里发生了什么?我们如何在不改变的情况下修复它GetMessages