- Asynchronous concurrency: multiple tasks are in progress at the same time, often waiting on I/O (like HTTP requests, file reads). this can be done using Task.WhenAll(task1, task2, .., taskn).
Task.WhenAllis great for asynchronous concurrency (I/O bound work like https request, db query etc), but not necessarily multithreaded CPU work. - Parallelism / multithreading: multiple threads actively running CPU-bound work simultaneously. e.g image processing
