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

你好,我是阿辉。

正文共2090字,预计阅读时间:6min。

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

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

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

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

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

任务并行库

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

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

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

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

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

一、创建任务

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

      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方法来访问任务结果。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

C#多线程开发-线程基础 01


C#多线程开发-线程同步02


C#多线程开发-线程池03

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.cue 文件格式

cue文件格式&#xff08;基础版&#xff09; PERFORMER "陈小春" TITLE "抱一抱" FILE "陈小春.-.[抱一抱].专辑.(ape).ape" WAVE TRACK 01 AUDIO TITLE "抱一抱" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "我爱的人…

python切片原理_深度解析Python切片

详解Python 切片语法 Python的切片是特别常用的功能&#xff0c;主要用于对列表的元素取值。使用切片也会让你的代码显得特别Pythonic。 切片的主要声明如下&#xff0c;假设现在有一个list&#xff0c;命名为alist&#xff1a; alist [0,1,2,3,4] 切片语法的基本形式为&#…

为什么数学不好,和语文有关系?

▲ 点击查看苏步青教授在担任复旦大学校长时曾经说过:“如果允许复旦大学单独招生考试&#xff0c;我的意见是第一堂课就考语文&#xff0c;考后就批卷子。不合格的&#xff0c;以下的功课就不要考了。语文你都不行&#xff0c;别的是学不通的。”苏步青作为享誉世界的数学家&a…

Docker 博客

Docker 常用命令&#xff1a;首先推荐&#xff1a;http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html Docker 网络桥接&#xff1a;http://blog.tankywoo.com/2014/12/22/docker-bridge-network.html docker 大牛的博客&#xff1a;http://blog.csdn.net/smal…

python string length_如何使用python获取字符串长度?哪些方法?

掌握多种python技巧&#xff0c;对于我们更好的灵活应用python是非常重要的&#xff0c;比如接下来给大家介绍的获取字节长度&#xff0c;那大家脑海里就该有印象了&#xff0c;有几种方法呢&#xff1f;一起来看下吧~1、使用len()函数这是最直接的方法。 在这里&#xff0c;我…

二进制、八进制、十进制、十六进制之间转换

一、 十进制与二进制之间的转换 &#xff08;1&#xff09; 十进制转换为二进制&#xff0c;分为整数部分和小数部分 ① 整数部分 方法&#xff1a;除2取余法&#xff0c;即每次将整数部分除以2&#xff0c;余数为该位权上的数&#xff0c;而商继续除以2&#xff0c;余数又为上…

【招聘(北京成都)】北森 招聘.NET 架构师工程师

.net后端架构师 25k-38k14薪工作职责:1.根据业务框架要求&#xff0c;提供技术实现方案&#xff1b;2.负责技术架构选型、并主导功能模块设计、数据结构设计、对外接口设计&#xff1b;3.负责核心技术攻关、系统调优&#xff0c;使系统架构、代码结构不断演进优化&#xff1b;4…

android 网络开发

反复研究了 Android Market&#xff0c;总结一下&#xff0c;之前发在新浪微博上&#xff0c;但不够详细&#xff0c;主要是提高用户体验。 1.网络异常处理&#xff0c;重试机制。 上wifi常常网络断开&#xff0c;那就看运用程序是否健壮。可以用Android 提供的 frameworks/bas…

python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法

大家知道&#xff0c;PyCharm是一款著名的Python IDE开发工具&#xff0c;是拥有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;具备基本的调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。该IDE分为社区免费版(…

python中线程和进程_python中线程和进程的简单了解

一、操作系统、应用程序1.硬件&#xff1a;硬盘、cpu、主板、显卡........2.装系统(本身也是一个软件)&#xff1a;系统就是一个由程序员写出来的软件&#xff0c;该软件用于控制计算机得硬盘&#xff0c;让他们之间进行互相配合。3.安装软件&#xff1a;各种应用程序二、并发和…

一份干货满满的PPT,答辩加分手到擒来!

全世界只有3.14 % 的人关注了爆炸吧知识对很多童鞋来说&#xff0c;PPT可以说是使用频率很高的办公软件了。毕业答辩需要PPT&#xff0c;项目总结需要PPT&#xff0c;演讲也都需要PPT……可你是否因为PPT陷入这样的——脑壳疼状态&#xff01;花费大量时间&#xff0c;结果PPT效…

《Java程序员全攻略:从小工到专家》连载八:加入什么样的公司

加入什么样的公司 “怎么样&#xff0c;蔡佳娃&#xff1f;听了这么多介绍&#xff0c;心里有点谱了吧&#xff1f;” “嗯&#xff0c;听师兄你这么一说&#xff0c;我想了想&#xff0c;还是优先要追求一下欧美的IT公司。追不到也没关系&#xff0c;至少知道自己不行了&#…

理解浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。

需要浮动的元素可使用CSS中float属性来定义元素的浮动位置&#xff0c;left&#xff1a;往左浮动&#xff0c;right&#xff1a;往右浮动浮动元素引起的问题&#xff1a;&#xff08;1&#xff09;父元素的高度无法被撑开&#xff0c;影响与父元素同级的元素&#xff08;2&…

Blazor+Dapr+K8s微服务之基于WSL安装K8s集群并部署微服务

前面文章已经演示过&#xff0c;将我们的示例微服务程序DaprTest1部署到k8s上并运行。当时用的k8s是Docker for desktop 自带的k8s&#xff0c;只要在Docker for desktop中启用就可以了。但是我发现&#xff0c;启用了k8s后&#xff0c;Docker for desktop会消耗大量的系统资源…

WebService事务处理

如果在WEB服务中有这样一个场景&#xff0c;某个WEB服务的方法要执行两个任务&#xff0c;它首先要在数据库中创建一个新表&#xff0c;接着调用对象来收集和格式化数据&#xff0c;并在新表中插入数据。象这样的一组方法&#xff0c;我们必须保证他们都成功执行&#xff0c;否…

我的新书,《人人都是产品经理》自序

是谁&#xff1f;每次K歌 都对着点歌面板评头论足。 是谁&#xff1f;逛超市时总在想“这个商品能解决什么需 求&#xff1f;”。 是谁&#xff1f;会给自己的个人发展做战略规划。 是谁&#xff1f;一定要在自己的婚礼中讲一个PPT。 是谁&#xff1f;会拿用户调研的方法与亲朋…

记一次 .NET 某新能源汽车锂电池检测程序 UI挂死分析

一&#xff1a;背景 1. 讲故事这世间事说来也奇怪&#xff0c;近两个月有三位朋友找到我&#xff0c;让我帮忙分析下他的程序hangon现象&#xff0c;这三个dump分别涉及&#xff1a;医疗&#xff0c;新能源&#xff0c;POS系统。截图如下&#xff1a;那这篇为什么要拿其中的 新…

C#FTP下载文件出现远程服务器返回错误: (500) 语法错误,无法识别命令

如果下载多个文件的时候&#xff0c;有时候莫名其妙的出现500服务器错误&#xff0c;很有可能是没有设置KeepAlive 属性导致的。 出现应用程序未处理的异常&#xff1a;2015/1/6 11:40:56 异常类型&#xff1a;WebException 异常消息&#xff1a;远程服务器返回错误: (500) 语法…

树莓派能直接运行python程序_树莓派怎么运行python程序

树莓派运行Python程序的方法&#xff1a;一、RaspBerry系统设置1、首先在开发板没有通电情况下&#xff0c;连接硬件&#xff0c;以及项目中用到传感器。比如当前项目需要将LED灯插在面包板上&#xff0c;然后通过杜邦线将开发板和面包板连接&#xff0c;硬件平台搭建完毕。2、…

这个女生躲在衣柜等男友回家,结果竟是......

1 不要什么都怪爸爸我妈明明也是这样帮我脱的▼2 这就是现实版大女主反杀女二的故事啊▼3 我猜到了开头却没有猜到结尾▼4 &#xff1f;&#xff1f;&#xff1f;一定是我被饿出了幻觉▼5 小小的孩子在极短的时间内经历了人生的大戏和大悲▼6 这个令人羡慕的发量啊&#…