MSDN does a good job of explaining this. The difference is pretty unambiguous.
Task.WhenAll:
Creates a task that will complete when all of the supplied tasks have completed.
Task.WaitAll:
Waits for all of the provided Task objects to complete execution.
So, essentially, WhenAll
gives you a task that isn't done until all of the tasks you give it are done (and allows program execution to continue immediately), whereas WaitAll
just blocks and waits for all of the tasks you pass to finish.