使用Task的Wait和Result时注意
如果计算限制的任务抛出未处理的异常,该异常会被“吞噬”并存储到一个集合中,而线程池线程可以返回到线程池中。调用Wait方法或者Result属性时,这些成员会抛出一个System.AggregateException对象。
如果一直不调用Wait或Result,或者一直不查询Task的Exception属性,代码就一直注意不到这个异常的发生。为能够发现没有注意到的异常,可以向TaskScheduler的静态UnobservedTaskException事件登记一个回调方法,每当一个Task被垃圾回收时,如果存在一个没有被注意到的异常,CLR的终结器线程就会引发这个事件,并且向事件处理方法传递一个UnobservedTaskExceptionEventArgs对象,该对象包含AggregateException。
当线程调用Wait方法时,系统检查线程要等待的Task是否已经开始执行。如果是,调用Wait的线程会被阻塞,直到Task运行结束为止。但如果Task还没有开始执行,系统可能(取决于TaskScheduler)使用调用Wait的线程来执行Task。在这种情况下调用Wait的线程不会被阻塞,它会执行Task并立即返回。好处在于没有线程会被阻塞,所以减少了对资源的占用(因为不需要再创建一个线程来替代被阻塞的线程),并提升了性能(因为不需要花时间来创建线程,也就没有上下文切换)。不好的地方在于,假如线程在调用Wait前已经获得了一个线程同步锁,而Task试图获取同一个锁,就会造成死锁的线程。
使用Task的Wait和Result时注意的更多相关文章
- [转]SSIS Execute SQL Task : Mapping Parameters And Result Sets
本文转自:http://www.programmersedge.com/post/2013/03/05/ssis-execute-sql-task-mapping-parameters-and-res ...
- C#基础之多线程与异步
1.基本概念 多线程与异步是两个不同概念,之所以把这两个放在一起学习,是因为这两者虽然有区别,但也有一定联系. 多线程是一个技术概念,相对于单线程而言,多线程是多个单线程同时处理逻辑.例如,假如说一个 ...
- Parallel Programming-Task Result && Continuation Task
本文主要介绍带有返回值的Task和Continuation Task 带返回值的Task Continuation Task ContinueWhenAll即多任务延续 一.带返回值的Task 1.1 ...
- async await task.Result 卡死
在如下代码中: public async Task<string> GetData() { return await DoWork(); } 在UI线程中调用 var data = Get ...
- .Net多线程编程—任务Task
1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...
- 异步方法的意义何在,Async和await以及Task的爱恨情仇,还有多线程那一家子。
前两天刚感受了下泛型接口的in和out,昨天就开始感受神奇的异步方法Async/await,当然顺路也看了眼多线程那几个.其实多线程异步相关的类单个用法和理解都不算困难,但是异步方法Async/awa ...
- spark job, stage ,task介绍。
1. spark 如何执行程序? 首先看下spark 的部署图: 节点类型有: 1. master 节点: 常驻master进程,负责管理全部worker节点. 2. worker 节点: 常驻wor ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- TPL实现Task.WhileAll扩展方法
文章翻译整理自 Nikola Malovic 两篇博文: Task.WhileAll Awaitable task progress reporting 当 Task.WhenAll 遇见 Task. ...
随机推荐
- SpringBoot: 7.整合jsp(转)
springboot内部对jsp的支持并不是特别理想,而springboot推荐的视图是Thymeleaf,对于java开发人员来说还是大多数人员喜欢使用jsp 1.创建maven项目,添加pom依赖 ...
- Python 面向对象(上)
一. 什么是面向对象? 1. 在了解面向对象之前,首先我们需要知道两个概念:(1)什么是函数?函数是对功能或动作的一种封装.函数的语法结构如下: def func(arg1): '''函数的内部有函数 ...
- BUGKU (Mountain climbing)
UPX壳,手脱后打不开,可能是在windows10脱壳的缘故吧.放在XP虚拟机上手脱可能会好,但是提示缺少dll.无奈,智能用工具了. 用的这个,感觉蛮好用的. 先打开程序.随便输入一个数,提示err ...
- 一、linux基础命令
一. 常用系统工作命令 1.echo 命令 echo命令用于在终端输出字符串或者变量提取后的值 echo $SHELL 2.date命令 date命令用于显示及设置系统的时间或者日期 参数 ...
- 【机器学习】Matlab中实现QQ-plot的一个好工具gqqplot
Matlab中实现QQ-plot的一个好工具gqqplot 26JUN June 26, 2013 这几天看了一下QQ-plot以及在Matlab中的实现,可是Matlab自带的qqplot函数不能满 ...
- linux-32bit-内存管理
一.进程与内存 进程如何使用内存? 毫无疑问所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不 ...
- Linux三剑客之grep常用参数详细总结
三剑客grep总结 grep : Linux三剑客老三 过滤需要的内容 参数: grep一般常用参数: -a :在二进制文件中,以文本文件的方式搜索数据 -c :计算找到 ’ 搜索字符串 ...
- Oracle-DQL 1- select基础
说明:语句中说到的“表”,以及表中有哪些“列”自行脑补......重要的是理解概念,能看懂语句代表的含义就可以了~ DQL-数据查询语句: 1.* 表示所有列SELECT * FROM emp; 2. ...
- Linux、Aix(unix)、Oracle 银行外包开发运维常用命令
我一直是银行外包开发人员,常用的操作命令固然少不了,这是我一次自己边添加边使用的笔记.内容有点乱,希望可以帮到你. rm 文件或目录rm -f 文件或目录rm -rf * 跑路的时候用du -h 文件 ...
- 桥接模式下访问虚拟机中的Django项目
首先需要保证主机和虚拟机能相互Ping通,如果Ping不通,请参考我上篇文章,这里演示的是桥接模式下的方法,如果是NAT模式连接,请参考别处. 1. 虚拟机Linux系统内的Django项目 sett ...