2013-08-19 38 views

回答

7

您仍然有Tasks的列表,並且每個Task都有一個Exception屬性。用這個你可以找出哪些例外屬於哪個Task

但是,如果可以的話,最好使用Task.WhenAllTaskFactory.ContinueWhenAll,而不要使用阻塞等待。

+0

是不是指向每個[Task.Exception](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.exception.aspx)傳遞給'catch'的同樣的'AggregateException異常'? – Noseratio

+2

不,每個「任務」都不知道其他任務,它只會有自己的例外。 –

+1

我有充分的理由等待所有。但我想這些信息對其他人來說是有好處的。雖然這個異常本身不能識別哪個任務失敗,但它可能是一個原本失敗的子任務,這有​​點奇怪。 – jgauffin

2
var throwers = tasks.Where(task => task.Exception != null); 
+0

可能在那裏拋出了一些任務,它們的異常彙總爲一個'AggregateException',AFAIK – Noseratio

+1

@Noseratio'throwers'上面是所有* *拋出異常的任務序列。可能都是,也可能不是,或者可能是任何數字 - 但他們每個人都有自己的例外。 –

0
 var t1 = Task.Factory.StartNew(() => Console.WriteLine("Task 1")); 
     var t2 = Task.Factory.StartNew(() => Console.WriteLine("Task 2")); 
     var t3 = Task.Factory.StartNew(() => { throw new InvalidOperationException(); }); 
     var t4 = Task.Factory.StartNew(() => Console.WriteLine("Task 4")); 

     Task.Factory.ContinueWhenAll(new[] { t1, t2, t3, t4 }, tasks => 
      { 
       foreach (var t in tasks) 
       { 
        if (t.Status == TaskStatus.Faulted) 
        { 
         // this will run for t3 
         Console.WriteLine("This task has been faulted."); 
        } 
       } 
      }); 
相關問題