title: How to handle partial success in a batch of Tasks?
body: <p>I have 3 Tasks that should run in parallel. I need to await all 3 and then continue processing their results. So something like:</p>
  
  <pre><code>var results = await Task.WhenAll(task1, task2, task3);
  return process(results);
  </code></pre>
  
  <p>This works fine when all 3 tasks complete successfully. However, if one of them fails I get an exception that bubbles up all the way. This is not what I want. If any of these tasks throws an <code>InvalidOperationException</code> I can continue processing, I just need the <code>process</code> method to have access to the exception that was thrown.  </p>
  
  <p>I realize that I can <code>try...catch</code> within the tasks but that does not seem like it would be a hack. Beyond being semantically incorrect (the task DID fail - it should not return successfully), if I went with this approach, since the result can be successful OR return an exception, I would have to return a custom type. The <code>Task&lt;T&gt;</code> object however already exposes an Exception channel so I would prefer to not do double-duty and just use what is already present.</p>