并发执行异步方法

ear*_*ing 6 c# async-await

使用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);
Run Code Online (Sandbox Code Playgroud)

使用典型等待,这3个调用将彼此同步执行.我将如何让它们同时执行并在完成后加入结果?

Jon*_*eet 10

我将如何让它们并行执行并在结果完成时加入结果?

最简单的方法就是创建所有任务,然后等待着他们:

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;
Run Code Online (Sandbox Code Playgroud)

你也可以考虑一下Task.WhenAll.您需要考虑多个任务失败的可能性......使用上面的代码,您将不会观察到失败,task3例如,如果task2失败 - 因为您的异步方法将task2在您等待之前传播异常task3.

我不是在这里建议一个特定的策略,因为它取决于你的具体情况.您可能只关心成功/失败并记录一个失败原因,在这种情况下上面的代码是正常的.否则,您可以将延续连接到原始任务以记录所有异常,例如.