Last Updated: May 22, 2026
When you have several independent async operations to run, awaiting them one at a time turns parallelism into a serial queue. Task.WhenAll and Task.WhenAny are the two combinators that fix this: one waits for every task in a set to finish, the other returns as soon as the first one completes. This lesson covers when to use each, how exceptions and partial failure surface through them, and a handful of common patterns (parallel fetches, replica racing, timeouts) that show up often in real code.