2013-08-22 45 views
0
var moduleTimeOut = 3000; 
var errorsThatOccurred = new List<string>(); 
List<string> names = new List<string>() { "Task1", "Task2", "Task3" }; 

var tasks = new List<Task<string>>(); 
names.ForEach(name => tasks.Add(Task<string>.Factory.StartNew((m) => MyTask(m.ToString()), name))); 

try 
{ 
    var allTasksCompletedInTime = Task.WaitAll(tasks.ToArray(), moduleTimeOut); 

} 
catch (AggregateException ex) 
{ 
    foreach (var exception in ex) 
    { 
     errorsThatOccurred.Add(exception.ToString()); 
    } 
} 
private string MyTask(string name) 
{ 
    if (name.Equals("Task1")) 
     System.Threading.Thread.Sleep(5000); 

    if (name.Equals("Task2")) 
     throw new ArgumentException("Task2 has thrown an exception"); 

    return "MyTask has finished the execution. Task is " + name; 
} 

我在捕獲AggregateException時遇到了一些問題。這是我不同的場景。Task.WaitAll在任務仍在運行時不拋出AggregateException

  1. 所有任務都按時完成。 →工作正常。

  2. Task2引發錯誤,所有其他任務及時完成。 →捕獲AggregateException並可以看到Task2拋出的ArgumentException。

  3. Task1沒有及時完成並仍在運行。 Task2引發錯誤。任務3已完成。 →AggregateException未觸發。我看到Task2狀態出現故障,Exception屬性中出現異常信息。

我不知道爲什麼它不會在場景#3中拋出AggregateException。任何幫助?

回答

3

這是預期的行爲。如果在所有任務完成之前(即運行完成,故障或取消)都達到超時,它將不會拋出異常:它只會返回false。

它只會在所有任務在指定時間內完成的情況下拋出異常。

+0

謝謝!那麼在這種情況下我應該如何捕獲所有異常?我不能等待完成所有任務來捕獲所有異常。 – user1186065

+0

@ user1186065您需要查看傳遞給'WaitAll'的每個任務的狀態,並跟蹤那些出現故障的任務。或者你可以創建你自己的'WaitAll'版本來代替你想要的行爲。 – Servy

相關問題