Using the async/await model, I have a method which makes 3 different calls to a web service and then returns the union of the results.
var result1 = await myService.GetData(source1);
var result2 = await myService.GetData(source2);
var result3 = await myService.GetData(source3);
allResults = Union(result1, result2, result3);
How would I go about letting them execute in parallel and join the results as they complete?
The simplest approach is just to create all the tasks and then await them:
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;
You might also consider
Task.WhenAll. You need to consider the possibility that more than one task will fail... with the above code you wouldn't observe the failure of
task3 for example, if
task2 fails - because your async method will propagate the exception from
task2 before you await
I'm not suggesting a particular strategy here, because it will depend on your exact scenario. You may only care about success/failure and logging one cause of failure, in which case the above code is fine. Otherwise, you could potentially attach continuations to the original tasks to log all exceptions, for example.