问题标签 [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# - 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
?我在这里没有掌握一些基本的东西吗?
c# - 通过`IAsyncEnumerable`并行Linq?
任何支持使用(.NET Standard 2.1)AsParallel
的官方或稳定的第 3 方库?IAsyncEnumerable<T>
由于额外的成本,我不想用异步方法或其他东西包装IAsyncEnumerable<T>
一个。IEnumerable<Task<T>>
TaskCompletionSource
c# - 使用 TaskCompletionSource 构建 IAsyncEnumerable
我有一个接受 anIEnumerable
并返回使用 yield 运算符转换的方法。要转换可枚举的一个元素,我首先需要知道另一个元素的值。因此,我想到了使用 aTaskCompletionSource
来创建类似“promise”的东西。
这里的问题是,如果“a”以外的任何值是 first 的值,则此代码会导致死锁TestFieldA
。一种解决方案是在将枚举传递给方法之前对其进行排序——在这种情况下,完全不需要TaskCompletionSource
。但是,我想知道是否可以在没有这个的情况下完成。我也知道这可以通过一些 LINQ 查询来完成,但这需要多次枚举输入,我想避免这种情况。
这就是我想要达到的目标。(仅适用于第一个TestFieldA == "a"
)
c# - IAsyncEnumerable 或 IAsyncEnumerator 的工厂
我想知道是否有一种方法可以创建IAsyncEnumerable<T>
或IAsyncEnumerator<T>
通过 Source 对象创建,而不是像TaskCompletionSource
允许一个人做任务一样。特别是,TaskCompletionSource
可以像任何其他参数一样传递。
也许是这样的:
使用上面的代码,handleAsyncResultsAsTheyHappen
任务将看到传递给 YieldReturn 的任何值。所以它会看到n
from 上面的代码,以及 the5
和10
from ChildMethod
。
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、控制台应用程序
c# - IAsyncEnumerable 不包含 ADO.NET 中“GetAwaiter”的定义
.Net Core 3.1、C# 8 中的这段代码:
导致此错误:
IAsyncEnumerable 不包含“GetAwaiter”的定义
此处提供的答案:https ://stackoverflow.com/a/60148747/4180382对我没有多大帮助,因为我的方法包含像示例中一样的产量和循环。
我应该做些什么改变?我不想返回列表。
c# - 使用 moq 在 C# 中为 IAsyncEnumerable 创建模拟设置
我正在尝试测试QueryAllScheduledJob方法。它包含对返回 IAsyncEnumerable 集合的 GetScheduledJobs 的调用。我已经为 GetScheduledJobs 创建了一个设置。我收到GetScheduledJobs类型为“空实例”的异常。在我的设置中,我尝试使用 Task.Result 进行返回,它给出了编译时错误。
实现类
测试班
c# - 是否可以在异步方法中返回指向 IAsyncEnumerable 的指针?
我有一个异步方法,它使用传递给它的委托函数来处理数据读取器。委托的目的是从阅读器中构造域对象并将其返回给调用者。我想要一个构造委托和读取器的中间方法,并从被调用的方法返回结果 IAsyncEnumerable。我能够做到这一点的唯一方法是实际使用 IAsyncEnumerable 并从中间方法产生这些结果。尝试直接返回会导致编译器错误,指出我必须使用 yield return 或 yield break。
c# - 使用 IAsyncEnumerable 重载方法
我正在构建一个 API,它将通过查询一个数据库来进行分页和排序,该数据库有很多条目,我停在我构建方法重载的地方,并且可以让它正常工作,至少以正确的方式我认为。
这是一个模拟代码:
我的问题是,在第一种方法(唯一一个参数)中它可以工作,但没有'async'关键字。
在第一个实现中,我添加了异步,但我收到了来自 Visual Studio 的警告,说我无法从迭代器返回值(这是有道理的),然后添加了“yield async”,它抱怨我无法将 PagedResults 转换为IAsyncEnumerable<PagedResults>。
我想知道我的最终实现是否正确,如果我使用第一种方法,它是否可以进行异步流式传输。
c# - C# 7.3 IAsyncEnumerator 对象的状态无效
我正在尝试为集合生成一个稳定的 IAsyncEnumerator。我正在使用 C# 7.3,我的目标框架是 .Net Standard 2.1 和 .Net Standard 2.0。
枚举器只有在我调试时才稳定。我基本上抓取了一个长度为 4 的对象列表。Promise 在列表中的最后一项附近或在我不太了解的情况下变得无效。我正在尝试扩展我的工具包,但是异步编程需要一些工作。我在网上四处寻找稳定迭代器的文章和示例。但一个都找不到。事实上,我发现的唯一一件事是 C# 8 将为您构建它。我完全不同意。人们应该了解他们选择使用的工具。
我根据我能找到的内容生成了以下代码。
单元测试
处理 IAsyncEnumerator 的部分类文件