title: Is there a "limit" to Task.WhenAll?
body: <p>If I need to perform IO-operations in a loop, I can create the <code>Task</code>s and them await them all. Something like this:</p>
  <pre><code>var tasks = new List&lt;Task&gt;();
  for (var dataToProcess in listOfData) {
      tasks.Add(DoSomeIOAsync(dataToProcess));
  }
  
  await Task.WhenAll(tasks);
  </code></pre>
  <p>How can I reason about what a reasonable number of <code>dataToProcess</code> in <code>listOfData</code> is?</p>
  <p>If <code>DoSomeIOAsync</code> is async, then the thread used would be returned while waiting for the IO. So no risk for thread pool starvation I guess?</p>
  <p>Is it the overhead of having a large amount of <code>Task</code> state machines in memory that might be a problem?</p>
  <p>Are there some guidelines that I can use to reason about this?</p>