【发布时间】:2021-10-17 07:41:19
【问题描述】:
这不是关于一般如何使用async 和await 的问题。它考虑了一个我在文档中没有找到的非常具体的案例。
我有一个我不习惯的类型设置。通常,我将await 和Task<Whatever> 设置为最终将具有的类型。现在,我陷入了以下困境,经过一段时间的尝试,我意识到我不知道如何摆脱output 中的Task<Thing> 类型。我只希望它是Thing。
Task<Thing>[] output = list.Select(async a => new Thing
{
Id = a.Id,
Name = a.Name,
Props = (await SomeService.GetAsync(a))
.Select(b => b.Value).ToArray()
}).ToArray();
要求output 的声明是明确的(即没有var)并且它不是异步的(即没有Task)。 output 的类型必须是Thing[],我不喜欢使用Task.WhenAll(output),因为它需要提前声明output,这违反了前两个要求。
需要内部await 才能应用Select。但这强加了外部async,因此使其成为事物的任务数组(即Task<Thing>[]),而不是事物的数组(即Thing[])。
我不能将await 放在列表前面,因为无法等待一系列任务。我不能把它放在lamba表达式中,因为它破坏了语法。
我已经对语法和示例进行了一些搜索,但这有点不常见,所以我发现没有什么价值。甚至可以做到吗?我相信它可以,但我不知道我们如何。我只找到this question。不过,它是相关的,但不够相似。而且答案实际上并没有显示如何实现我想要的(即在变量声明中消除了var 和Task)。
【问题讨论】:
标签: c# .net-core async-await task-parallel-library