4

我将异步委托传递给 LINQSelect方法,我更愿意获取 s 列表ValueTask而不是Tasks 列表。我该怎么做?例子:

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我想要的 s?

4

1 回答 1

5

您可以像这样显式编写值任务

var result = (new[] { 0 }).Select<int, ValueTask>(async x => await Task.Yield()).ToArray();
于 2020-01-25T19:15:43.897 回答