如何选择异步委托的返回类型

4

我正在将异步委托传递给LINQ Select方法,并且我希望获得一个ValueTask列表而不是一个Task列表。我该怎么做?示例:

var result = (new[] { 0 }).Select(async x => await Task.Yield()).ToArray();
Console.WriteLine($"Result type: {result.GetType()}");

结果类型:System.Threading.Tasks.Task[]

这并不理想。我发现可以通过将异步委托替换为异步方法来创建所需的列表,如下所示:

var result = (new[] { 0 }).Select(DoAsync).ToArray();
Console.WriteLine($"Result type: {result.GetType()}");
async ValueTask DoAsync(int arg)
{
    await Task.Yield();
}

结果类型:System.Threading.Tasks.ValueTask[]

这个方法可以工作,但不够优雅。有没有办法保留简洁的委托语法,并获得我想要的 ValueTask

1个回答

5
您可以像这样显式地编写值任务。
var result = (new[] { 0 }).Select<int, ValueTask>(async x => await Task.Yield()).ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接