问题标签 [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 投票
1 回答
2089 浏览

c# - 在 IAsyncEnumerable 中让步的替代方法

我正在尝试检索使用 C# 8.0 中的新 AsyncEnumerables 分页的数据。回到同步 IEnumerable 世界,代码看起来像这样:

使用 IAsyncEnumerable 我认为它看起来像这样:

这似乎有点啰嗦,但是没有 yield 关键字还有更好的方法吗?

谢谢,

编辑:

这是由于 ReSharper 在升级到 C# 8 时静默安装包 System.Interactive.Async 引起的。我将其卸载并遵循 Stephen 的建议。

对于谷歌:

0 投票
2 回答
3546 浏览

razor-pages - 你可以在 Razor 页面中使用 IAsyncEnumerable 来逐步显示标记吗?

我一直在玩 Blazor 和 C# 8.0 中的 IAsyncEnumerable 功能。是否可以在 Razor 页面中使用 IAsyncEnumerable 和 await 来逐步显示带有数据的标记?

示例服务:

剃刀页面中的示例:

这会产生错误 CS4033:“等待”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

如果可能的话,有什么想法吗?

0 投票
5 回答
1482 浏览

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方法以使其表现得体?

0 投票
2 回答
1740 浏览

c# - 如何停止传播异步流 (IAsyncEnumerable)

我有一个接受IAsyncEnumerable作为参数的方法,并且还返回一个IAsyncEnumerable. 它为输入流中的每个项目调用一个 Web 方法,并将结果传播到输出流。我的问题是,如果我的方法的调用者已停止枚举输出流,如何通知我,以便我可以停止枚举我的方法中的输入流?似乎我应该能够收到通知,因为调用者默认处理IAsyncEnumerator从我的方法中获取的内容。是否有任何内置机制为编译器生成的异步方法生成这样的通知?如果不是,最容易实施的替代方案是什么?

例子。Web 方法验证 url 是否有效。提供了一个永无止境的 url 流,但是当发现超过 2 个无效 url 时调用者停止枚举结果:

网址的生成器。每 300 毫秒生成一个 url。

url 的验证器。需要急切地枚举输入流,因此两个异步工作流并行运行。第一个工作流程将 url 插入队列中,第二个工作流程逐个挑选 url 并验证它们。ABufferBlock用作异步队列。

澄清:队列是强制性的,删除它不是一种选择。它是这个问题的一个重要组成部分。

单个 url 的验证器。验证过程平均持续 300 毫秒。

输出:

问题是在调用者/客户端完成异步枚举后仍然会生成和接收 url。我想解决这个问题,以便在--Async enumeration finished--.

0 投票
3 回答
5211 浏览

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是应该解决此问题的必需扩展方法。

0 投票
1 回答
1613 浏览

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 值应该是什么?

0 投票
1 回答
717 浏览

c# - 在 IAsyncEnumerable 方法中正确处理?

对此的答案可能是不可能的,但问题是:假设您有一个 C# 方法来使用TextReader返回的 a 中的行IAsyncEnumerable<string>。你如何确保什么时候被DisposeAsync调用?或者这是您需要编写自定义实现来实现的?IAsyncEnumerator<string>TextReader

0 投票
1 回答
12787 浏览

c# - IAsyncEnumerable 的 Linq 方法

使用时,可以使用命名空间IEnumerable<T>中的内置扩展方法,System.Linq例如Skip,WhereSelect

当微软IAsyncEnumerable在 C#8 中添加时,他们是否也添加了新的 Linq 方法来支持这一点?

我当然可以自己实现这些方法,或者可能找到一些可以做到这一点的包,但如果存在,我更喜欢使用语言标准方法。

0 投票
1 回答
1077 浏览

c# - C# 8 异步流与 REST/RPC

我确信这个问题将证明我的无知,但我很难理解这一点。我愿意问一个愚蠢的问题以获得一个好的答案。

我读过的所有关于异步流的帖子都很好地展示了该功能,但它们没有解释为什么它比替代方案有所改进。

或者,也许,什么时候应该使用异步流而不是旧的客户端-服务器通信?

我可以看到流式传输大文件的内容可能适合异步流,但我见过的许多示例都使用异步流来传输少量传感器数据(例如温度)。似乎带有温度传感器的物联网设备只需将数据 HTTP POST 到服务器,服务器就可以响应。在这种情况下,服务器为什么要实现异步流?

当你难以理解这些话时,我已经能感觉到你的痛苦,但请怜悯我。:)

根据要求,这里有一些我遇到的让我感到困惑的例子。当我找到它们时,我会发布更多信息,但我想继续让你开始:

0 投票
1 回答
3655 浏览

c# - 异步流与响应式扩展相比如何?

如何比较以下两者?Rx 更强大吗?

反应式扩展:

异步流: