2013-08-22 43 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

相关问题