WaitAll is a void function that lets your code wait for completion of multiple tasks right away, at the time when you call it.
WhenAll, on the other hand, produces a Task that will wait for other tasks when it is its time to run. For example, if you are building a Task that needs to initialize a couple of things, and then run some computation, you can do it like this:
var initThenRun = Task
.WhenAll(initTask1, initTask2, initTask3)
.ContinueWith(computationTask);
Now the initThenRun task will run the three initialization tasks, wait for all of them to complete, and only then proceed to the computationTask.