WhenAll 用于包含任务的匿名类型
WhenAll for anonymous type containing a Task
是否可以等待包含 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>
你只需要让你的 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 将隐式地 return 一个 Task<AnonymousObject>
。
顺便说一句,您的 ToArray()
是多余的,因为 Task.WhenAll
无论如何都会枚举 Task
。
是否可以等待包含 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>
你只需要让你的 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 将隐式地 return 一个 Task<AnonymousObject>
。
顺便说一句,您的 ToArray()
是多余的,因为 Task.WhenAll
无论如何都会枚举 Task
。