title: Handeling errors in the TPL when I am adding threads to a collection
body: <p>I am working on a Producer Consumer model where each item produced is consumed on a new Task Parallel Library thread and tracked in a <code>List&lt;Task&gt;</code> collection.  I want to be able to catch any unhanded exceptions in a timely and predictable manner.  In a loop I remove the finished threads from the collection and was thinking of something like the following but have not seen any thing online about this.</p>
  
  <pre><code>try
  {
      Task.WaitAll(threadList.FindAll(x =&gt; x.IsFaulted).ToArray());
  }
  catch(AggregateException aex)
  {
      //Deal with the exceptions and possibly kill the program
  }
  
  threadList.RemoveAll(x =&gt; x.IsCompleted);
  </code></pre>
  
  <p>Due to good error handling in the child threads there should never be an unhandled exception except things like OutOfMemoryException's and the like.  If that happens I want to catch it and die gracefully with logging.</p>
  
  <p>Are there any better options or even designs I should be looking at?</p>