zoukankan      html  css  js  c++  java
  • 使用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试图获取同一个锁,就会造成死锁的线程。

  • 相关阅读:
    Linux文件与文件系统的压缩
    Linux命令与文件查找
    js兼容pc和移动端的简单拖拽效果
    图片懒加载插件
    css小特效
    创建对象和方法
    距离2021年春节还剩。。。
    固定尺寸的图片焦点图案例
    数据库操作
    简单sql操作
  • 原文地址:https://www.cnblogs.com/xuejietong/p/8899368.html
Copyright © 2011-2022 走看看