我正在将异步委托(delegate)传递给 LINQ Select
方法,并且我希望获取 ValueTask
的列表s 而不是 Task
的列表s。我该怎么做?示例:
var result = (new[] { 0 }).Select(async x => await Task.Yield()).ToArray();
Console.WriteLine($"Result type: {result.GetType()}");
Result type: System.Threading.Tasks.Task[]
这是不可取的。我发现我可以通过用异步方法替换异步委托(delegate)来创建我想要的列表,如下所示:
var result = (new[] { 0 }).Select(DoAsync).ToArray();
Console.WriteLine($"Result type: {result.GetType()}");
async ValueTask DoAsync(int arg)
{
await Task.Yield();
}
Result type: System.Threading.Tasks.ValueTask[]
这可行,但很尴尬。有什么方法可以保持简洁的委托(delegate)语法,同时仍然获得我想要的 ValueTask 吗?
最佳答案
您可以像这样显式编写值任务
var result = (new[] { 0 }).Select<int, ValueTask>(async x => await Task.Yield()).ToArray();
关于c# - 如何选择异步委托(delegate)的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59912423/