我正在将异步委托传递给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
?
答案 0 :(得分:5)
您可以像这样显式地编写价值任务
var result = (new[] { 0 }).Select<int, ValueTask>(async x => await Task.Yield()).ToArray();