No doubts that
async/await pattern has significantly simplified working with asynchronous operations in C#. However, this simplification relates only to the situation when asynchronous operations are executed consequently. If we need to execute several asynchronous operations simultaneously (e.g. we need to call several micro-services) then we do not have many built-in capabilities and most probably
Task.WhenAll will be used:
Task<SomeType1> someAsyncOp1 = SomeAsyncOperation1(); Task<SomeType2> someAsyncOp2 = SomeAsyncOperation2(); Task<SomeType3> someAsyncOp3 = SomeAsyncOperation3(); Task<SomeType4> someAsyncOp4 = SomeAsyncOperation4(); await Task.WhenAll(someAsyncOp1, someAsyncOp2, someAsyncOp4); var result = new SomeContainer( someAsyncOp1.Result,someAsyncOp2.Result,someAsyncOp3.Result, someAsyncOp4.Result);
This is a working solution, but it is quite verbose and not very reliable (you can forget to add a new task to “WhenAll”). I would prefer something like that instead:
var result = await from r1 in SomeAsyncOperation1() from r2 in SomeAsyncOperation2() from r3 in SomeAsyncOperation3() from r4 in SomeAsyncOperation4() select new SomeContainer(r1, r2, r3, r4);
Further I will tell you what is necessary for this construction to work...