问题标签 [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 回答
365 浏览

c# - Task.WhenAll 在列表中IEnumerable 上的行为与 Task.WhenAll 不同

在尝试捕获异常时调用Task.WhenAll(IEnumerable<Task<T>>)和调用时,我看到了一些奇怪的行为差异Task.WhenAll(List<Task<T>>)

我的代码如下:

最终,我有一个IEnumerable标识符,我将其分批成 2 个(在本例中为硬编码),然后运行Task.WhenAll以同时运行每批 2 个。

我想要的是,如果 2 个GetResource任务中的 1 个失败,仍然返回另一个的成功结果,并处理异常(例如,将其写入日志)。

如果我Task.WhenAll在任务列表上运行,这正是我想要的。但是,如果我删除.ToList(),当我试图在 之后的 catch 块中找到我的错误任务时await taskGroup,我会遇到问题,因为我的任务状态仍然存在,WaitingForActivation尽管我相信它们已被等待。

当没有抛出异常时,List和的IEnumerable行为方式相同。这只会在我尝试捕获异常时开始引起问题。

这种行为背后的原因是什么?Task.WhenAll自从我进入 catch 块以来,必须已经完成,但是为什么状态仍然存在WaitingForActivation?我在这里没有掌握一些基本的东西吗?

0 投票
1 回答
451 浏览

c# - 通过`IAsyncEnumerable`并行Linq?

任何支持使用(.NET Standard 2.1)AsParallel的官方或稳定的第 3 方库?IAsyncEnumerable<T>

由于额外的成本,我不想用异步方法或其他东西包装IAsyncEnumerable<T>一个。IEnumerable<Task<T>>TaskCompletionSource

0 投票
2 回答
258 浏览

c# - 使用 TaskCompletionSource 构建 IAsyncEnumerable

我有一个接受 anIEnumerable并返回使用 yield 运算符转换的方法。要转换可枚举的一个元素,我首先需要知道另一个元素的值。因此,我想到了使用 aTaskCompletionSource来创建类似“promise”的东西。

这里的问题是,如果“a”以外的任何值是 first 的值,则此代码会导致死锁TestFieldA。一种解决方案是在将枚举传递给方法之前对其进行排序——在这种情况下,完全不需要TaskCompletionSource。但是,我想知道是否可以在没有这个的情况下完成。我也知道这可以通过一些 LINQ 查询来完成,但这需要多次枚举输入,我想避免这种情况。

这就是我想要达到的目标。(仅适用于第一个TestFieldA == "a"

0 投票
3 回答
1646 浏览

c# - IAsyncEnumerable 或 IAsyncEnumerator 的工厂

我想知道是否有一种方法可以创建IAsyncEnumerable<T>IAsyncEnumerator<T>通过 Source 对象创建,而不是像TaskCompletionSource允许一个人做任务一样。特别是,TaskCompletionSource可以像任何其他参数一样传递。

也许是这样的:

使用上面的代码,handleAsyncResultsAsTheyHappen任务将看到传递给 YieldReturn 的任何值。所以它会看到nfrom 上面的代码,以及 the510from ChildMethod

0 投票
1 回答
320 浏览

c# - 最终锁定后,代码未在 IAsyncEnumerable 迭代器中执行

我在枚举IAsyncEnumerable, 并附加了System.Linq.Async运算符时遇到了一个奇怪的问题。Take在我的迭代器中,我有一个 try-finally 块,块内产生了一些值,try块内有一些清理代码finally。清理代码位于lock块内。问题是块后面的任何代码lock都不会执行。没有抛出异常,只是忽略了代码,就像它不存在一样。这是一个重现此行为的程序:

输出:

控制台中未打印文本“Finally after lock” !

这只发生在Take连接了操作员的情况下。如果没有操作符,文本将按预期打印。

这是System.Linq.Async库中的错误、C# 编译器中的错误还是其他什么?

作为一种解决方法,我目前在 内部使用嵌套的 try-finally 块finally,它可以工作但很尴尬:

.NET Core 3.1.3、.NET Framework 4.8.4150.0、C# 8、System.Linq.Async 4.1.1、Visual Studio 16.5.4、控制台应用程序

0 投票
1 回答
807 浏览

c# - IAsyncEnumerable 不包含 ADO.NET 中“GetAwaiter”的定义

.Net Core 3.1、C# 8 中的这段代码:

导致此错误:

IAsyncEnumerable 不包含“GetAwaiter”的定义

此处提供的答案:https ://stackoverflow.com/a/60148747/4180382对我没有多大帮助,因为我的方法包含像示例中一样的产量和循环。

我应该做些什么改变?我不想返回列表。

0 投票
0 回答
375 浏览

c# - 使用 moq 在 C# 中为 IAsyncEnumerable 创建模拟设置

我正在尝试测试QueryAllScheduledJob方法。它包含对返回 IAsyncEnumerable 集合的 GetScheduledJobs 的调用。我已经为 GetScheduledJobs 创建了一个设置。我收到GetScheduledJobs类型为“空实例”的异常。在我的设置中,我尝试使用 Task.Result 进行返回,它给出了编译时错误。

实现类

测试班

0 投票
1 回答
202 浏览

c# - 是否可以在异步方法中返回指向 IAsyncEnumerable 的指针?

我有一个异步方法,它使用传递给它的委托函数来处理数据读取器。委托的目的是从阅读器中构造域对象并将其返回给调用者。我想要一个构造委托和读取器的中间方法,并从被调用的方法返回结果 IAsyncEnumerable。我能够做到这一点的唯一方法是实际使用 IAsyncEnumerable 并从中间方法产生这些结果。尝试直接返回会导致编译器错误,指出我必须使用 yield return 或 yield break。

0 投票
0 回答
207 浏览

c# - 使用 IAsyncEnumerable 重载方法

我正在构建一个 API,它将通过查询一个数据库来进行分页和排序,该数据库有很多条目,我停在我构建方法重载的地方,并且可以让它正常工作,至少以正确的方式我认为。

这是一个模拟代码:

我的问题是,在第一种方法(唯一一个参数)中它可以工作,但没有'async'关键字。

在第一个实现中,我添加了异步,但我收到了来自 Visual Studio 的警告,说我无法从迭代器返回值(这是有道理的),然后添加了“yield async”,它抱怨我无法将 PagedResults 转换为IAsyncEnumerable<PagedResults>。

我想知道我的最终实现是否正确,如果我使用第一种方法,它是否可以进行异步流式传输。

0 投票
0 回答
924 浏览

c# - C# 7.3 IAsyncEnumerator 对象的状态无效

我正在尝试为集合生成一个稳定的 IAsyncEnumerator。我正在使用 C# 7.3,我的目标框架是 .Net Standard 2.1 和 .Net Standard 2.0。

枚举器只有在我调试时才稳定。我基本上抓取了一个长度为 4 的对象列表。Promise 在列表中的最后一项附近或在我不太了解的情况下变得无效。我正在尝试扩展我的工具包,但是异步编程需要一些工作。我在网上四处寻找稳定迭代器的文章和示例。但一个都找不到。事实上,我发现的唯一一件事是 C# 8 将为您构建它。我完全不同意。人们应该了解他们选择使用的工具。

我根据我能找到的内容生成了以下代码。

单元测试

处理 IAsyncEnumerator 的部分类文件