标签:
Task task1 = new Task(() => { ArgumentOutOfRangeException exception = new ArgumentOutOfRangeException(); exception.Source= "task1"; throw exception; }); Task task2 = new Task(() => { throw new NullReferenceException(); }); Task task3 = new Task(() => { Console.WriteLine("Hello from Task 3"); }); task1.Start();task2.Start(); task3.Start(); try{ Task.WaitAll(task1,task2, task3); } catch(AggregateException ex) { //enumerate the exceptions that have been aggregated foreach(Exception inner in ex.InnerExceptions) { Console.WriteLine("Exception type {0} from {1}", inner.GetType(),inner.Source); } }
以上代码中,创建了3个task,分别抛出不同的异常类型,在UI线程中使用AggregateException来GetType并获取Source来获得异常信息做不同的处理。
在上述代码的catch中,可以使用如下代码完成通过代理处理异常:
try { Task.WaitAll(task1, task2); } catch (AggregateException ex) { ex.Handle((inner) => { if (inner is OperationCanceledException) { // ...handle task cancellation... return true; } else { return false; }
上述代码使用了1个代理来接收每个AggregateException中的每个异常并进行处理。有关更多Task的属性还有Task.IsCompleted,Task.IsFaulted,Task.IsCanceled分别用于获取是否完成,是否出错,是否取消。
如果Task中的异常没有被处理,那么在Task被回收时程序会被终止,由于Task被回收的时间不能确定,程序终止的时间也不能确定,因此一定要处理好Task中的异常。
TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) => { eventArgs.SetObserved(); ((AggregateException)eventArgs.Exception).Handle(ex=> { //addlog here Console.WriteLine("Exception type: {0}, Source : {1}", ex.GetType(), ex.Source); return true; }); }; //create tasks that will throw an exception Task task1 = new Task(() => { throw new NullReferenceException(); }); Task task2 = new Task(() => { throw new ArgumentOutOfRangeException(); }); // startthe tasks task1.Start();task2.Start(); while(!task1.IsCompleted || !task2.IsCompleted){ Thread.Sleep(200); }
以上代码中,开启了两个Task,并在TaskScheduler中捕捉Task中没有捕捉到的异常。
标签:
原文地址:http://blog.csdn.net/lan_liang/article/details/45112359