When waiting for Tasks using Task.WaitAll and specifying a timeout if the WaitAll times out do I also have to separately observe any unfinished tasks (e.g. by registering a continuation)?
This thread leads me to think the answer is yes, but I haven't found anything else that confirms this.
var random = new Random(); var tasks = Enumerable.Range(0, 10).Select((i) => Task.Factory.StartNew(() => { // Sleep 5-15 seconds Thread.Sleep(random.Next(5000, 15000)); throw new Exception("Some exception."); } )).ToArray(); try { // Wait for 10 seconds Task.WaitAll(tasks, 10000); } catch (AggregateException) { // Swallow } // Check to see how many tasks were unfinished tasks.Where(t => !t.IsCompleted).Count().Dump("Unfinished count: "); // Is this neccessary to avoid exceptions being thrown on the finalizer? foreach (Task task in tasks) { task.ContinueWith(t => t.Exception, TaskContinuationOptions.OnlyOnFaulted); }