存在参数依赖时如何使用WhenAll()?

问题描述 投票:0回答:1

在执行多个异步任务时,我想使用

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
的值已被检索到?

c# asynchronous task task-parallel-library
1个回答
0
投票

async
/
await
是可组合的。这允许您拥有一个
async
方法,该方法将
Task<T>
作为参数,并在启动和等待取决于任务结果的异步操作之前执行此任务。示例:
await

局部函数

var item1Task = _service.GetItem1(item1Id); var item2Task = _service.GetItem2(item2Id); var item3Task = LocalGetItem3(item1Task); var allTasks = Task.WhenAll(item1Task, item2Task, item3Task); async Task<Z> LocalGetItem3(Task<X> item1Task) { X item1 = await item1Task; return await _service.GetItem3(item1); } 是具有

LocalGetItem3
/
async
组合的方法。
显然,操作 

await

_service.GetItem1
将按顺序运行,一个接一个,因为第二个操作取决于第一个操作的结果。如果
_service.GetItem3
失败,任务
_service.GetItem1
将在其
allTasks
 属性中包含两次相同的异常。这是因为任务 
Exception
item1Task
都会因相同的错误而失败。
    

© www.soinside.com 2019 - 2024. All rights reserved.