Task 编程中的异常处理
时间:2022-07-22
本文章向大家介绍Task 编程中的异常处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Task 编程中的异常处理
在 .Net 开发中, 使用 Task
、 Task<T>
进行异步编程是非常方便的, 但是在处理 Task 产生的异常时, 需要注意一个问题, 比如下面的代码:
static Task<int> TestAsync(int a, int b) {
var tcs = new TaskCompletionSource<int>();
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.");
}
当程序运行结束时, 会产生下图所示的异常:
关键的是这段文字:
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 产生的异常, 否则将会导致你的程序异常退出。
- css重写checkbox样式
- 通过shell脚本同时监控多个数据库负载(r5笔记第14天)
- Java 定时器 Timer 的使用.
- 通过shell脚本来统计段大小(r5笔记第14天)
- Linux下配置MySQL主从复制(r5笔记第13天)
- Final 关键字
- ArrayList 和 LinkedList的执行效率比较
- 关于consistent gets(r5笔记第12天)
- wait/notify 实现多线程交叉备份
- 01.SVN介绍与安装
- 由sqlplus中的一个小细节所做的折腾(r5笔记第11天)
- 浅析多线程的对象锁和Class锁
- 使用strace诊断奇怪的sqlplus登录问题(r5笔记第29天)
- 读书笔记 之《Thinking in Java》(对象、集合、异常)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kotlin项目加入Glide图片加载库并使用GlideApp的方法
- Android实现百分比下载进度条效果
- 实验2 OpenGL交互
- 深入了解OkHttp3之Interceptors
- 实验3.1 直线光栅化(键盘交互版)
- 150行Python代码实现带界面的数独游戏
- 实验4 编码裁剪算法
- 浅谈Python中os模块及shutil模块的常规操作
- Python decorator拦截器代码实例解析
- 实验4.1 编码裁剪算法(鼠标交互版)
- python实现对变位词的判断方法
- python实现一个猜拳游戏
- 实验5 OpenGL二维几何变换
- Python关键字及可变参数*args,**kw原理解析
- 实验6 OpenGL模型视图变换