问题标签 [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 中让步的替代方法
我正在尝试检索使用 C# 8.0 中的新 AsyncEnumerables 分页的数据。回到同步 IEnumerable 世界,代码看起来像这样:
使用 IAsyncEnumerable 我认为它看起来像这样:
这似乎有点啰嗦,但是没有 yield 关键字还有更好的方法吗?
谢谢,
乔
编辑:
这是由于 ReSharper 在升级到 C# 8 时静默安装包 System.Interactive.Async 引起的。我将其卸载并遵循 Stephen 的建议。
对于谷歌:
razor-pages - 你可以在 Razor 页面中使用 IAsyncEnumerable 来逐步显示标记吗?
我一直在玩 Blazor 和 C# 8.0 中的 IAsyncEnumerable 功能。是否可以在 Razor 页面中使用 IAsyncEnumerable 和 await 来逐步显示带有数据的标记?
示例服务:
剃刀页面中的示例:
这会产生错误 CS4033:“等待”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。
如果可能的话,有什么想法吗?
c# - 如何实现一个高效的 WhenEach 流式传输任务结果的 IAsyncEnumerable?
我正在尝试使用C# 8提供的新工具更新我的工具集,其中一种似乎特别有用的方法是Task.WhenAll
返回IAsyncEnumerable
. 此方法应在任务结果可用时立即对其进行流式传输,因此命名它WhenAll
没有多大意义。WhenEach
听起来更合适。该方法的签名是:
这种方法可以像这样使用:
预期输出:
已处理:5
已处理:4
已处理:1
已处理:3
已处理:2
我设法Task.WhenAny
在循环中使用该方法编写了一个基本实现,但是这种方法存在问题:
问题是性能。的实现创建了Task.WhenAny
所提供任务列表的防御性副本,因此在循环中重复调用它会导致 O(n²) 计算复杂度。我幼稚的实现很难处理 10,000 个任务。我的机器上的开销将近 10 秒。我希望该方法几乎与 build-in 一样高效Task.WhenAll
,可以轻松处理数十万个任务。我该如何改进WhenEach
方法以使其表现得体?
c# - 如何停止传播异步流 (IAsyncEnumerable)
我有一个接受IAsyncEnumerable
作为参数的方法,并且还返回一个IAsyncEnumerable
. 它为输入流中的每个项目调用一个 Web 方法,并将结果传播到输出流。我的问题是,如果我的方法的调用者已停止枚举输出流,如何通知我,以便我可以停止枚举我的方法中的输入流?似乎我应该能够收到通知,因为调用者默认处理IAsyncEnumerator
从我的方法中获取的内容。是否有任何内置机制为编译器生成的异步方法生成这样的通知?如果不是,最容易实施的替代方案是什么?
例子。Web 方法验证 url 是否有效。提供了一个永无止境的 url 流,但是当发现超过 2 个无效 url 时调用者停止枚举结果:
网址的生成器。每 300 毫秒生成一个 url。
url 的验证器。需要急切地枚举输入流,因此两个异步工作流并行运行。第一个工作流程将 url 插入队列中,第二个工作流程逐个挑选 url 并验证它们。ABufferBlock
用作异步队列。
澄清:队列是强制性的,删除它不是一种选择。它是这个问题的一个重要组成部分。
单个 url 的验证器。验证过程平均持续 300 毫秒。
输出:
问题是在调用者/客户端完成异步枚举后仍然会生成和接收 url。我想解决这个问题,以便在--Async enumeration finished--
.
c# - 如何强制 IAsyncEnumerable 尊重 CancellationToken
编辑:这个问题的要求已经改变。请参阅下面的更新部分。
我有一个异步迭代器方法,它每 200 毫秒产生一个IAsyncEnumerable<int>
(数字流)一个数字。此方法的调用者使用流,但希望在 1000 毫秒后停止枚举。因此CancellationTokenSource
使用了 a,并且令牌作为参数传递给WithCancellation
扩展方法。但是令牌不受尊重。枚举一直持续到所有数字都被消耗完:
输出:
12:55:17.506 > 1
12:55:17.739 > 2
12:55:17.941 > 3
12:55:18.155 > 4
12:55:18.367 > 5
12:55:18.570 > 6
12:55:18.772 > 7
12 :55:18.973 > 8
12:55:19.174 > 9
12:55:19.376 > 10
预期的输出是TaskCanceledException
在数字 5 之后发生。看来我误解了WithCancellation
实际在做什么。该方法只是将提供的令牌传递给迭代器方法,如果该方法接受一个。否则,就像GetSequence()
我的示例中的方法一样,令牌将被忽略。我想我的解决方案是手动查询枚举体内的令牌:
这很简单并且效果很好。但无论如何,我想知道是否有可能创建一个扩展方法来做我期望WithCancellation
做的事情,在随后的枚举中烘焙令牌。这是所需方法的签名:
更新:似乎当我问这个问题时,我对整个取消概念的目的有一个不正确的理解。我的印象是取消是为了在等待之后打破循环MoveNextAsync
,而真正的目的是取消等待本身。在我的简单示例中,等待仅持续 200 毫秒,但在现实世界的示例中,等待可能更长,甚至是无限的。意识到这一点后,我现在的问题几乎没有价值,我必须要么删除它并打开一个具有相同标题的新问题,要么更改现有问题的要求。这两种选择都以某种方式不好。
我决定选择第二个选项。因此,我不接受当前接受的答案,并且我正在寻求一种新的解决方案,以解决以立即生效的方式执行取消的更困难的问题。换句话说,取消令牌应该会导致异步枚举在几毫秒内完成。让我们举一个实际的例子来区分合意和不合意的行为:
输出(理想):
0:00.242 > 1
0:00.467 > 2
0:00.500 > 取消
输出(不良):
0:00.242 > 1
0:00.467 > 2
0:00.707 > 取消
GetSequence
与初始示例中的方法相同,每 200 毫秒传输一个数字。此方法不支持取消,前提是我们无法更改。WithEnforcedCancellation
是应该解决此问题的必需扩展方法。
c# - 如何在 C# 8+ 中从 WebAPI 发送 IAsyncEnumerator 并通过 HttpClient 流式传输数据?
存在使用内部服务将数据从 IAsyncEnumerator 读取到 Blazor 应用中的 UI 的示例 。还存在有关如何将IAsyncEnumerator作为 Web API 控制器操作的输出发送的示例。
我还没有看到任何示例,如何在 Blazor 或 Xamarin 等客户端中使用 HttpClient 从 API 读取 IAsyncEnumerator 流。到目前为止,我所做的一切都是在 API 上的 async/await foreach 循环完成后才返回客户端上的 HttpResponseMessage 。
HttpGet 操作的内容类型应该是什么(Produces 属性)?来自 HttpClient 的请求标头上的 Accept 值应该是什么?
c# - 在 IAsyncEnumerable 方法中正确处理?
对此的答案可能是不可能的,但问题是:假设您有一个 C# 方法来使用TextReader
返回的 a 中的行IAsyncEnumerable<string>
。你如何确保什么时候被DisposeAsync
调用?或者这是您需要编写自定义实现来实现的?IAsyncEnumerator<string>
TextReader
c# - IAsyncEnumerable 的 Linq 方法
使用时,可以使用命名空间IEnumerable<T>
中的内置扩展方法,System.Linq
例如Skip
,Where
和Select
。
当微软IAsyncEnumerable
在 C#8 中添加时,他们是否也添加了新的 Linq 方法来支持这一点?
我当然可以自己实现这些方法,或者可能找到一些可以做到这一点的包,但如果存在,我更喜欢使用语言标准方法。
c# - C# 8 异步流与 REST/RPC
我确信这个问题将证明我的无知,但我很难理解这一点。我愿意问一个愚蠢的问题以获得一个好的答案。
我读过的所有关于异步流的帖子都很好地展示了该功能,但它们没有解释为什么它比替代方案有所改进。
或者,也许,什么时候应该使用异步流而不是旧的客户端-服务器通信?
我可以看到流式传输大文件的内容可能适合异步流,但我见过的许多示例都使用异步流来传输少量传感器数据(例如温度)。似乎带有温度传感器的物联网设备只需将数据 HTTP POST 到服务器,服务器就可以响应。在这种情况下,服务器为什么要实现异步流?
当你难以理解这些话时,我已经能感觉到你的痛苦,但请怜悯我。:)
根据要求,这里有一些我遇到的让我感到困惑的例子。当我找到它们时,我会发布更多信息,但我想继续让你开始:
- .NET Conf 主题演讲的前半部分是一个大规模的异步流演示......我不明白他们为什么在这里使用异步流:https ://www.youtube.com/watch?v=1xQE2bWkwjo&list=PLReL099Y5nRd04p81Q7p5TtyjCrj9tz1t&index=4&t =
- 这是另一个让我感到困惑的例子
c# - 异步流与响应式扩展相比如何?
如何比较以下两者?Rx 更强大吗?
反应式扩展:
异步流: