WhenAll 用于包含任务的匿名类型

Posted

技术标签:

【中文标题】WhenAll 用于包含任务的匿名类型【英文标题】:WhenAll for anonymous type containing a Task 【发布时间】:2021-08-16 10:55:32 【问题描述】:

是否可以等待包含 Task 的匿名对象(或 Tuple,不关心)...最好用代码来解释...

假设我们有这个:

async Task<Item> GetItem(int i);

基本案例(作品):

var itemTasks = new []1,2,3.Select(i => GetItem(i)).toArray();
Item[] items = await Task.WhenAll(itemTasks);

我想做的事

var itemTasks = new []1,2,3
    .Select(i => new  MyItem = GetItem(i), TheNumber = i )
    .toArray();
//some way to wait for all and get a collection of<anynomous type above> 

【问题讨论】:

GetItem 是否与getItem 相同? C# 是区分大小写的语言。 【参考方案1】:

你只需要让你的 lambda async:

var itemTasks = new [] 1, 2, 3 
    .Select(async i => new  MyItem = await GetItem(i), TheNumber = i );

var anonymousObjects = await Task.WhenAll(itemTasks);

async lambda 将隐式返回 Task&lt;AnonymousObject&gt;


顺便说一句,您的ToArray() 是多余的,因为Task.WhenAll 无论如何都会枚举Tasks。

【讨论】:

甜蜜!谢谢乔纳森!没错。我认为这是一些正在进行的工作。感谢您的帮助! Task.WhenAll 将在返回之前将所有任务复制到内部数组中。

以上是关于WhenAll 用于包含任务的匿名类型的主要内容,如果未能解决你的问题,请参考以下文章

用于将匿名类型投影到视图模型上的 Automapper 查询

类和结构

合并匿名类型

具有匿名类型和用户定义类型的 LINQ 选择查询

Linq查询返回匿名类型错误

MVVM - 如何处理 ViewModel 中由模型组成的匿名类型