gpt4 book ai didi

c# - 如何在异步 C# 任务中使用 yield

转载 作者:太空狗 更新时间:2023-10-29 21:16:09 27 4
gpt4 key购买 nike

我正在尝试让您在异步任务中使用 yield 并返回将 X 转换为 Y 的结果。但是,我在选择时遇到错误。错误是:

Error CS1942 The type of the expression in the select clause is incorrect. Type inference failed in the call to 'Select'.

public async Task<Result<dynamic>> GetYAsync(IEnumerable<X> infos)
{
return Task.WhenAll(from info in infos.ToArray() select async ()=>
{
yield return await new Y(info.Id, "Start");
});
}

最佳答案

简短回答:您不能使用异步 yield 语句。

但在大多数情况下,您不需要这样做。使用 LINQ您可以在将所有任务传递到 Task.WaitAll 之前汇总所有任务.我简化了您的示例以返回 IEnumerable<int> ,但这适用于所有类型。

public class Program
{
public static Task<int> X(int x)
{
return Task.FromResult(x);
}

public static async Task<IEnumerable<int>> GetYAsync(IEnumerable<int> infos)
{
var res = await Task.WhenAll(infos.Select(info => X(info)));
return res;
}

public static async void Main()
{
var test = await GetYAsync(new [] {1, 2, 3});
Console.WriteLine(test);
}
}

你的例子有另一个错误await new Y(...) ,构造函数不能是异步的,因此我将其替换为异步函数。 (正如评论中所暗示的,在技术上可以创建自定义等待类型并使用 new 创建此类型,尽管很少使用)

上面的例子使用了infos.Select创建挂起任务列表,通过调用函数 X 返回.然后将等待并返回此任务列表。

workaround应该适合大多数情况。 .Net 不支持真正的异步迭代器,例如在 JavaScript 中。

更新:此功能目前建议作为语言提案:Async Streams .所以也许我们将来会看到这一点。

更新:如果您需要异步迭代器,目前有几个选项可用:

  1. react 流,RX.Net ,它为您提供基于事件的异步可观察流。
  2. 有异步迭代器或异步枚举的实现 AsyncEnumerable或者 .Net Async Enumerable

关于c# - 如何在异步 C# 任务中使用 yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51854217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com