欢迎来到思维库

思维库

C#多线程开发之任务并行库

时间:2025-11-05 15:16:35 出处:综合阅读(143)

本文转载自微信公众号「Andy阿辉」,线程行库作者阿辉 。线程行库转载本文请联系Andy阿辉公众号。线程行库

之前学习了线程池,线程行库知道了它有很多好处。线程行库

使用线程池可以使我们在减少并行度花销时节省操作系统资源。线程行库可认为线程池是线程行库一个抽象层,其向程序员隐藏了使用线程的线程行库细节,使我们可以专心处理程序逻辑,线程行库而不是线程行库各种线程问题。

但也不是线程行库说我们所有的项目中都上线程池,其实它也有很多弊端,线程行库比如我们需要自定义使用异步委托的线程行库方式才可以将线程中的消息或异常传递出来。这些如果在一个大的线程行库软件系统中,会导致软件结构过于混乱,线程行库各个线程之间消息传递来传递去的,如果发生没有处理掉的异常,很容易导致软件出现致命错误。

为了解决这个问题,在.Net Framework 4.0中引入了一个新的异步操作的API,它叫任务并行库(TPL)。

那么接下来,让我们一起来认识一下这个TPL,站群服务器看看它到底有什么魔力可以把线程池中的棘手问题解决掉。

任务并行库

TPL又被认为是线程池的有一个抽象,其对程序员隐藏了线程池交互的底层代码,并只提供了更方便的细粒度的API。

TPL的核心是任务。一个任务代表一个异步操作,该操作可以通过多种方式运行,可以使用或不使用独立线程运行。

TPL有一个关键优势,就是一个任务可以通过多种方式和其它任务组合起来。

比如可以同时开启多个任务,等待所有任务完成,然后运行一个任务对之前所有任务的结果进行一些计算。

可以使用AggregateException来捕获底层任务内部所有异常,并允许单独处理这些异常。在C#5.0中已经内置了对TPL的支持,允许我们使用心得await和async关键字以平滑的、舒服的方式操作任务。

一、创建任务

可以通过下面三种方式来创建任务。b2b信息网

var a1 = new Task(()=>TastMethod("线程01"));       a1.Start();       Task.Run(()=>TastMethod("线程001"));    //已弃用       Task.Factory.StartNew(()=>TastMethod("线程02"));       Task.Factory.StartNew(() => TastMethod("线程03"),TaskCreationOptions.LongRunning);       Console.ReadKey(); 

在最新的.NET 5.0中已经将任务快速启动方式Run,丢弃掉了。只能使用其余的两种。实例化的Tast属性,必须进行启动,任务才可以执行。其余的.NET已经做了内置,只需要使用就默认自动开启。

在线程3开启过程中,增加了TaskCreationOptions.LongRuning参数,它表示标记该任务为长时间运行,结果该任务将不会使用线程池,而在单独的线程中运行。然而根据运行该任务的当前任务调度程序,运行方式可能不同。

二、使用任务执行基本操作

下面介绍下从任务中得到其计算法返回的结果。

static void Main(string[] args)        {               var a1 = new Task<int>(()=>TastMethod("线程01"));            a1.Start();            int result = a1.Result;                        Console.WriteLine("result:" + result);            Console.ReadKey();        }        static int TastMethod(string name)         {            Console.WriteLine("线程名字:"+name+"Id:"+Thread.CurrentThread.ManagedThreadId+"是否属于线程池:"+Thread.CurrentThread.IsThreadPoolThread);            return 40;        } 

输出结果

这里我们声明并运行了线程01并等待结果,该任务会被放置在线程池中,并且主线程会等待,直到任务返回前一直处于阻塞状态。

其实也可以调用方法RunSynchronously()方法,使其特定运行在主线程。这是一个非常好的亿华云计算优化,可以避免使用线程池来执行非常短暂的操作。

三、处理任务中的异常

在异步任务中,对于异常的处理是非常重要的。

try {     var a1 = new Task<int>(() => TastMethod("线程01",2));     a1.Start();     int result = a1.Result;     Console.WriteLine("result:" + result); } catch (Exception ex) {     Console.WriteLine(ex.Message); }       

当程序启动时,创建了一个任务并尝试同步获取任务结果。Result属性的Get部分会使当前线程等待直到该任务结束,并将异常传播给当前线程。此时通过try/catch是很容易捕获到的(需要注意AggregateExceptiont,它被封装起来,)。

int result = a1.GetAwaiter().GetResult ; 

上面这种情况无需封装异常,可以使用GetAwaiter和GetResult方法来访问任务结果。

分享到:

上一篇:ubuntu搭建nginx+scala+play 2.0运行环境学scala有段时间了,最近用scala做了个社区:,开始买了个内存512的vps,但是编译都不通过,jvm提示无法为对象分配空间,囧,升级到1G,经过3个小时的奋战,终于配置成功了,顺便也记录下。1、安装nginx,mysql编译什么的网上一大堆,就不细说了,大家可以google下。2、安装JDK注意:ubuntu用户请务必将OpenJDK替换成sunJDK[ubuntu用户]01sudo add-apt-repository ppa:ferramroberto/java02#假如上面命令提示:command not found,就输入如下命令:sudo apt-get install python-software-properties0304sudo apt-get update05sudo apt-get install sun-java6-jre sun-java6-plugin06sudo apt-get install sun-java6-jdk0708update-alternatives --config java09#选择jdk,输入上面命令后会有3个选项,选择第2个选项10 Selection    Path                                      Priority   Status11------------------------------------------------------------12* 0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      auto mode13 1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      manual mode14 2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        manual mode[非ubuntu用户]http://www.oracle.com/technetwork/java/javase/downloads/index.html解压后我把文件移动到了/usr/local/下修改/etc/profile文件1export JAVA_HOME=/usr/local/jdk1.7.0_052    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar3export PATH=$PATH:$JAVA_HOME/bin3、下载playframework文件[cc lang=c]http://www.playframework.org/[/cc] 3.1、安装scala,只运行play2.0的话是可以不用安装的。1http://www.scala-lang.org/   #下载debin包,假如安装的openjdk的话可能出现缺少 janic2    dpkg -I scala-2.9.2.deb 3.2、安装sbt https://github.com/harrah/xsbt/wiki/Getting-Started-Setup 我是安装ubuntu的方法安装的,记得别忘了下载,不然会提示找不到sbt包 http://apt.typesafe.com/repo-deb-build-0002.deb1dpkg -I repo-deb-build-0002.deb2apt-get update3apt-get install sbt 安装过程中可能需要点时间,完成后测试进入scala目录测试 sbt4、启动play2.0项目1play2start -Dhttp.port=90005、nginx设置代理01    server02 {03 listen       80;04 server_name *.cn-scala.com cn-scala.com;0506 location /static {07 root     /static/public;08}09 location  / {10 proxy_pass    http://127.0.0.1:9000;11 proxy_set_header Host $host;12 proxy_set_header X-Real-IP $remote_addr;13}14 }

下一篇:电脑excer基本操作教程(学会电脑excer,提高工作效率)

温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!

猜你喜欢

友情链接: