使用async / await模型,我有一个方法,它对Web服务进行3次不同的调用,然后返回结果的并集.
var result1 = await myService.GetData(source1); var result2 = await myService.GetData(source2); var result3 = await myService.GetData(source3); allResults = Union(result1,result2,result3);
使用典型等待,这3个调用将彼此同步执行.我将如何让它们同时执行并在完成后加入结果?
解决方法
How would I go about letting them execute in parallel and join the results as they complete?
最简单的方法就是创建所有任务然后等待它们:
var task1 = myService.GetData(source1); var task2 = myService.GetData(source2); var task3 = myService.GetData(source3); // Now everything's started,we can await them var result1 = await task1; var result1 = await task2; var result1 = await task3;
您可能还会考虑Task.WhenAll
.您需要考虑多个任务失败的可能性…使用上面的代码您不会观察到task3的失败,例如,如果task2失败 – 因为您的异步方法将传播异常在等待task3之前从task2.
我不是在这里建议一个特定的策略,因为它取决于你的具体情况.您可能只关心成功/失败并记录一个失败原因,在这种情况下上面的代码是正常的.否则,您可以将延续连接到原始任务以记录所有异常,例如.