我试图在异步任务中使用产率并返回将X转换为Y的结果。但是,我在select上得到了一个错误。错误是:
错误CS1942 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");
});
}
发布于 2018-08-14 23:14:11
简短的回答:您不能使用异步收益语句。
但在大多数情况下你不需要这么做。使用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(...)
,构造函数不能是异步的,因此我用异步函数替换了它。(正如注释中所暗示的,在技术上可以创建自定义awaitable类型,并使用new
创建此类型,尽管很少使用这种类型),
上面的示例使用infos.Select
创建一个挂起的任务列表,该列表通过调用X
函数返回。然后将等待并返回此任务列表。
这个workaround
应该适合大多数情况。实际的异步迭代器(例如在JavaScript中)在.Net中不受支持。
更新:这个特性目前被建议为语言提案:异步流。所以也许我们将来会看到这一点。
更新:如果您需要异步迭代器,目前有几个选项可用:
发布于 2018-08-14 23:07:06
你不知道。异步Enum支持(和产量是实现枚举的)提供了C# 8在2019年的某一点上看。所以,就目前而言,答案就是你没有。
您得到错误的原因是您也不能返回结果。收益率(返回)是特定于实现枚举的。您的方法签名不匹配。
https://stackoverflow.com/questions/51854217
复制相似问题