免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NET 4 并行 多核 编程系列之二并行 多核 编程系列之二 从从 Task 开始开始 前言 我们一步步的从简单的开始讲述 还是沿用我一直的方式 慢慢演化 步步为营 本篇文章的议题如下 1 Task 基础介绍 2 Task 的创建 3 获取 Task 的执行结果 4 补充细节 系列文章链接 NET 4 并行 多核 编程系列之一入门介绍 NET 4 并行 多核 编程系列之二 从 Task 开始 NET 4 并行 多核 编程系列之三 从 Task 的取消 NET 4 并行 多核 编程系列之四 Task 的休眠 NET 并行 多核 编程系列之五 Task 执行和异常处理 NET 并行 多核 编程系列之六 Task 基础部分完结篇 NET 并行 多核 编程系列之七 共享数据问题和解决概述 1 Task 基础介绍 首先我们还是来看看一段简单的代码 这里展示的只是一段简单的代码 不能显示出并行编程的特点 但是我们还是从最基本的开 始看 慢慢进入深一点的话题 如果你曾经用过 NET 中的多线程编程 比较一下 就会发现 这段代码虽然在底层还是使 用了多线程 但是写法上却简化了很多 一行代码就实现了一个并行编程 下面我们就从 Task 类开始谈 Task 类是 Task Programming Library TPL 中最核心的一个类 下面我将会像大家展示 如何使用一些方法来创建不同类型的 Task 取消 Task 等待 Task 执行完成 获取 Task 执行后的结果和对异常进行处理 在开始讨论之前 我们首先快速的看看之前的代码 这个命名空间将会是我们之后在讲述并行编程经常使用的一个 这个空间包含了很多与并行 编程有关的类 还有一个要你使用的命名空间是 System Threading 大家对这个应该比较熟悉了 之前 的多线程编程常常使用到 这个空间下包含了一些在并行编程中用来协调数据的一些类 上面代码中 最主要的代码如下 Task Factory StartNew Console WriteLine Hello World 我们用静态方法 Task Factory StartNew 来创建了一个最简单的 Task 在屏幕上打印 一句话 这段代码确实简单 而且都没有任何输入和需要返回的结果 下面我们就正式进入议题 2 Task 的创建 如果只是创建一个简单的 Task 我们只要为该 Task 提供一个执行体就行了 执行体可以 是一个委托 delegate 或者 action 我们之前展示的那段代码就是采用了 lambda 表达式来作 为 Task 的执行体 2 1 创建一个简单的 Task 为了执行一个简单的 Task 一般进行以下步骤 首先 要创建一个 Task 类的实例 然后 传入一个 System Action 委托 这个委托中的方法就是这个 Task 运行时你要执行 的方法 而且这个委托必须作为 Task 构造函数的一个参数传入 我们在传入委托作为参数的 时候有多种方式 传入匿名委托 Lambda 表达式或者一个显示什么方法的委托 最后 调用 Task 实例的 Start 方法来运行 当这个 Task 实例开始运行的时候 它就被传给了内部的一个 task scheduler 这个 scheduler 负责把我们创建的 task 交给底下的线程去执行 下面就看看代码 using System using System Threading Tasks namespace Listing 02 class Listing 02 static void Main string args use an Action delegate and a named method Task task1 new Task new Action printMessage use a anonymous delegate Task task2 new Task delegate printMessage use a lambda expression and a named method Task task3 new Task printMessage use a lambda expression and an anonymous method Task task4 new Task printMessage task1 Start task2 Start task3 Start task4 Start wait for input before exiting Console WriteLine Main method complete Press enter to f inish Console ReadLine static void printMessage Console WriteLine Hello World 不知道大家注意到了没有 上面代码创建 Task 的方法和我们之前的第一段代码的创建 Task 的方法不同 在之前我们采用的是 Task Factory StartNew 方法来创建的 这个方法 创建 Task 并且开始运行 Task 其实两端代码的结果是一样的 这里给出一点建议 如果这是 想简单的创建一个 Task 那么使用 Factory NewStart 来创建 很简便 如果像对所创建的 Task 附加更多的定制和设置特定的属性 那么还是得一步一步的按照我们说的那些步骤来 详细的我们后续会介绍的 2 1 为创建的 Task 传入参数 我们之前提过 在创建 Task 的时候 我们在构造函数中传入了一个 System Action 的委 托 如果我们想要把一些参数传入到 Task 中 那么我 们可以传入 System Action的 委托 其中的那个 object 就是我们传入的参数 还是给大家举个例子 using System using System Threading Tasks namespace Listing 04 class Listing 04 static void Main string args string messages First task Second task Third task Fourth task foreach string msg in messages Task myTask new Task obj printMessage string ob j msg myTask Start wait for input before exiting Console WriteLine Main method complete Press enter to f inish Console ReadLine static void printMessage string message Console WriteLine Message 0 message 注意 我们在传入参数后 必须把参数转换为它们原来的类型 然后再去调用相应的方法 例子中 因为 System Action 对应的方法是 printMessage 方法 而这个方法的要求的参 数类型是 string 所以要转换为 string 想向想向 Task 传入参素 只能用传入参素 只能用 System Action 3 获取 Task 的执行结果 如果要获取 Task 的结果 那么在创建 Task 的时候 就要采用 Task来实例化一个 Task 其中的那个 T 就是 task 执行完成之后返回结果的类型 之后采用 Task 实例的 Result 属性就可以获取结果 代码显示如下 static void Main string args create the task Task task1 new Task int sum 0 for int i 0 i 100 i sum i return sum task1 Start write out the result Console WriteLine Result 1 0 task1 Result Console ReadLine 只有在 task 执行完成之后 才能获取到 Result 的值 下面的代码展示了如何通过 Task Factory StartNew 创建一个 Task 并且获取结 果 static void Main string args create the task Task task1 Task Factory StartNew int sum 0 for int i 0 i 100 i sum i return sum write out the result Console WriteLine Result 1 0 task1 Result Console ReadLine 4 补充细节 在创建 Task 的时候 Task 有很多的构造函数的重载 一个主要的重载就是传入 TaskCreateOptions 的枚举 TaskCreateOptions None 用默认的方式创建一个 Task TaskCreateOptions PreferFairness 请求 scheduler 尽量公平的执行 Task 后续文章会 将是 Task 和线程一样 有优先级的 TaskCreateOptions LongRunning 声明 Task 将会长时间的运行 TaskCreateOptions AttachToPa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冷链物流预冷技术调试技师考试试卷及答案
- 2025年六安某国企外包岗位招聘10人笔试历年参考题库附带答案详解
- 2025年上半年四川遂宁产业投资集团有限公司招聘4人笔试历年参考题库附带答案详解
- 2025山东青岛上合临空控股发展集团有限公司社会招聘5人笔试历年参考题库附带答案详解
- 2025山东日照城投集团有限公司高层次人才招聘28人笔试历年参考题库附带答案详解
- 2025安徽山湖控股集团有限公司马鞍山数字未来产业投资有限公司等区内选聘11人笔试历年参考题库附带答案详解
- 2025天津市国资系统监管企业财务部门负责人选聘笔试历年参考题库附带答案详解
- 2025国家电投集团所属国家核电招聘41人笔试历年参考题库附带答案详解
- 2025四川达州钢铁集团招聘500人笔试历年参考题库附带答案详解
- 2025四川乐山市市中区国有企业校园招聘员工20人笔试历年参考题库附带答案详解
- 2026年公立医院检验科招聘试题(附答案)
- 2026年自然资源统一确权登记知识测试题
- 2026年二级注册计量师(计量法律法规及综合知识)考试试题及答案
- 钢连廊吊顶及屋顶幕墙安装施工方案
- 2026年北京市顺义区高三一模语文试题
- 2026广东警官学院招聘事业单位人员5人备考题库及答案详解【夺冠】
- 公司业务首单奖励制度
- 房产巡检监督制度
- 2026年中考数学模拟试卷及答案解析(共四套)
- 【《斯特林发动机的发展现状与趋势文献综述》1800字】
- 2025年法医临床考试题库及答案
评论
0/150
提交评论