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
所有任務都按時完成。 →工作正常。
Task2引發錯誤,所有其他任務及時完成。 →捕獲AggregateException並可以看到Task2拋出的ArgumentException。
Task1沒有及時完成並仍在運行。 Task2引發錯誤。任務3已完成。 →AggregateException未觸發。我看到Task2狀態出現故障,Exception屬性中出現異常信息。
我不知道爲什麼它不會在場景#3中拋出AggregateException。任何幫助?
謝謝!那麼在這種情況下我應該如何捕獲所有異常?我不能等待完成所有任務來捕獲所有異常。 – user1186065
@ user1186065您需要查看傳遞給'WaitAll'的每個任務的狀態,並跟蹤那些出現故障的任務。或者你可以創建你自己的'WaitAll'版本來代替你想要的行爲。 – Servy