首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在异步C#任务中使用产量

如何在异步C#任务中使用产量
EN

Stack Overflow用户
提问于 2018-08-15 06:56:35
回答 2查看 6.4K关注 0票数 5

我试图在异步任务中使用产率并返回将X转换为Y的结果。但是,我在select上得到了一个错误。错误是:

错误CS1942 select子句中表达式的类型不正确。类型推断在调用“选择”时失败。

代码语言:javascript
代码运行次数:0
运行
复制
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");
        });
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-15 07:14:11

简短的回答:您不能使用异步收益语句。

但在大多数情况下你不需要这么做。使用LINQ,您可以在将所有任务传递到Task.WaitAll之前聚合它们。我将您的示例简化为返回一个IEnumerable<int>,但这将适用于每种类型。

代码语言:javascript
代码运行次数:0
运行
复制
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(...),构造函数不能是异步的,因此我用异步函数替换了它。(正如注释中所暗示的,在技术上可以创建自定义awaitable类型,并使用new创建此类型,尽管很少使用这种类型),

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

这个workaround应该适合大多数情况。实际的异步迭代器(例如在JavaScript中)在.Net中不受支持。

更新:这个特性目前被建议为语言提案:异步流。所以也许我们将来会看到这一点。

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

  1. Reactive,RX.Net,它为您提供基于事件的异步可观察流。
  2. 有异步迭代器或异步枚举AsyncEnumerable.Net异步枚举的实现。
票数 6
EN

Stack Overflow用户

发布于 2018-08-15 07:07:06

你不知道。异步Enum支持(和产量是实现枚举的)提供了C# 8在2019年的某一点上看。所以,就目前而言,答案就是你没有。

您得到错误的原因是您也不能返回结果。收益率(返回)是特定于实现枚举的。您的方法签名不匹配。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51854217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档