在执行多个异步任务时,我想使用
WhenAll()
方法,这样我就可以获得使用它的好处:组合错误传播等
鉴于以下情况:
var item1Task = _service.GetItem1(item1Id);
var item2Task = _service.GetItem2(item2Id);
var item3Task = _service.GetItem3(item3Id);
var allTasks = Task.WhenAll(item1Task, item2Task, item3Task);
try
{
await allTasks;
}
catch
{
... // some error handling
}
return new AggregateItems()
{
Item1 = item1Task.Result,
Item2 = item2Task.Result,
Item3 = item3Task.Result,
}
如果传递给
item3Id
的参数 _service.GetItem3(item3Id)
来自 Item1
的属性,是否有办法仍然将 GetItem3()
调用合并到 WhenAll()
方法中,或者它必须存在于该方法之外? Item1
的值已被检索到?
async
/await
是可组合的。这允许您拥有一个 async
方法,该方法将 Task<T>
作为参数,并在启动和等待取决于任务结果的异步操作之前执行此任务。示例:await
局部函数LocalGetItem3
/async
组合的方法。显然,操作 await
和
_service.GetItem1
将按顺序运行,一个接一个,因为第二个操作取决于第一个操作的结果。如果 _service.GetItem3
失败,任务 _service.GetItem1
将在其 allTasks
属性中包含两次相同的异常。这是因为任务
Exception
和 item1Task
都会因相同的错误而失败。