博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Task 编程中的异常处理
阅读量:5286 次
发布时间:2019-06-14

本文共 1569 字,大约阅读时间需要 5 分钟。

在 .Net 开发中, 使用 Task 、 Task<T> 进行异步编程是非常方便的, 但是在处理 Task 产生的异常时, 需要注意一个问题, 比如下面的代码:

static Task
TestAsync(int a, int b) { var tcs = new TaskCompletionSource
(); Task.Factory.StartNew(() => { if (a + b < 0) { tcs.TrySetException(new InvalidOperationException("a + b < 0")); } else { tcs.TrySetResult(a + b); } }); return tcs.Task;}

当输入的两个参数之和小于 0 时, tcs 会设置一个 InvalidOperationException , 如果直接运行这段代码, 当这个函数返回的 Task 被 GC 回收时, 将会产生 AggregateException was unhandled 的异常, 运行代码如下:

static void Main(string[] args) {   TestAsync(5, -10);   Thread.Sleep(TimeSpan.FromMilliseconds(3000));   GC.Collect();   Console.WriteLine("Completed.");}

当程序运行结束时, 会产生下图所示的异常:

2012-07-05_130006

关键的是这段文字:

A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread.

没有在等待 Task 完成时捕获其异常, 也没有读取 Task 的 Exception 属性, 结果导致异常被终结线程重新抛出。 也就是说, Task 异常有两种处理方式:

1、 调用 Task 的 Wait 方法时使用 try-catch 捕获异常:

var testTask = TestAsync(5, -10);try {   testTask.Wait();}catch(Exception ex) {   Console.WriteLine(ex);}

2、 在 Task 的 ContinueWith 方法中读取 Task 的 Exception 属性:

var testTask = TestAsync(5, -10);testTask.ContinueWith(task => {   if (task.IsFaulted) {      Console.WriteLine(task.Exception.GetBaseException());   }   else {      Console.WriteLine(task.Result);   }});

在 .Net 4.0 、 Sliverlight 5.0 、以及 MonoTouch 中均有类似的问题, 因此, 必须小心翼翼的处理 Task 产生的异常, 否则将会导致你的程序异常退出。

转载于:https://www.cnblogs.com/beginor/archive/2012/07/05/2577692.html

你可能感兴趣的文章
Python--GIL 详解
查看>>
大道至简读后感(第四章)
查看>>
IDA IDC Tutorials: Additional Auto-Commenting
查看>>
k8s-存储卷1-十二
查看>>
INSERT IGNORE INTO / REPLACE INTO
查看>>
Python数据类型-布尔/数字/字符串/列表/元组/字典/集合
查看>>
【刷题】SPOJ 705 SUBST1 - New Distinct Substrings
查看>>
IEEE 754浮点数表示标准
查看>>
declare 结构用来设定一段代码的执行指令
查看>>
图解算法读书笔记
查看>>
调试学习笔记
查看>>
解开lambda最强作用的神秘面纱
查看>>
Java基础:Object类中的equals与hashCode方法
查看>>
C#拦截Http请求
查看>>
图片下载器
查看>>
找不到docker.socket解决方法
查看>>
Activity生命周期
查看>>
sql server和mysql中分别实现分页功能
查看>>
kafka server管理
查看>>
系统设计与分析(六)
查看>>