第4章 使用任务并行库
时间:2019-12-07
本文章向大家介绍第4章 使用任务并行库,主要包括第4章 使用任务并行库使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
4.2 创建任务
- 将学习一个新的异步编程范式 —— 任务并行库。
- 线程池可以认为是一个抽象层,向程序员隐藏了使用线程的细节。 线程池使用较为复杂,从线程池的工作线程中获得结果并不容易。我们需要自定义方式来获取,有了异常,还需要正确地传播到初始线程中。
- .net framework4.0引入了一个关于异步操作的api——任务并行库(TPL)。TPL可认为是线程池之上的又一个抽象层。
- TPL核心概念是任务。一个任务代表一个异步操作。该操作可以通过多种方式运行,可以使用或不使用独立线程运行。默认情况下,程序员无须知道任务是如何执行的。坏处是有些时候会导致诡异的错误。
处理任务中的异常结果有多种方式。由于一个任务可能会由单个其他任务组成,这些任务可能依次拥有自己子任务。所以有一个AggregateException异常。可以将AggregateException异常看做是任务并行库编程中最上层的异常。这种异常可以捕获底层任务内所有异常,并允许单独处理这些异常。
- 代码
static void Main(string[] args)
{
var t1 = new Task(()=>TaskMethod("task1"));
var t2 = new Task(()=>TaskMethod("task2"));
t2.Start();
t1.Start();
Task.Run(()=>TaskMethod("task3"));
Task.Factory.StartNew(()=>TaskMethod("task4"));
Task.Factory.StartNew(()=>TaskMethod("task5"),TaskCreationOptions.LongRunning);
Thread.Sleep(TimeSpan.FromSeconds(1));
Console.Read();
}
static void TaskMethod(string name)
{
Console.WriteLine("task {0} is running on a thread id{1}. is thread pool thread:{2}",name,Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread);
}
- 工作原理
- Task构造函数里传入lambda表达式作为action委托,启动两个任务。用Start方法启动任务后才会执行。
- Task.Run、Task.Factory.StartNew运行另外两个任务(前者是后者的快捷方式)。这两个创建的任务会立刻工作,不用调Start方法。另外,后者标记为长时间运行,结果该任务将不会使用线程池,而是在单独线程中运行。
4.3 使用任务执行基本的操作
- 本节将描述如何从任务中获取结果值。
Main方法
#region 4.3
Class4_3.TaskMethod("“t0”");
Task<int> task = Class4_3.CreateTask("t1");
task.Start();
int result = task.Result;//获得任务结果值
Console.WriteLine("result is {0}",result);
task = Class4_3.CreateTask("t2");
task.RunSynchronously();// 对当前的 TaskScheduler 同步运行Task。
result = task.Result;
Console.WriteLine("result is {0}", result);
task = Class4_3.CreateTask("t3");
task.Start();
while (!task.IsCompleted)
{
Console.WriteLine(task.Status);//任务状态
Thread.Sleep(500);
}
Console.WriteLine(task.Status);
result = task.Result;
Console.WriteLine("result is {0}", result);
#endregion
public class Class4_3
{
public static Task<int> CreateTask(string name)
{
return new Task<int>(()=>TaskMethod(name));
}
public static int TaskMethod(string name)
{
Console.WriteLine("task {0} is running on a thread id {1} .is thread pool thread:{2}",name,Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(1000);
return 42;
}
}
工作原理
- t1是任务方式运行。而t2通过那个方法被放到主线程中运行。可以避免使用线程池来执行非常短暂的操作。t0也是在主线程中同步运行,t0和t2很显然不是线程池中线程。
原文地址:https://www.cnblogs.com/anjun-xy/p/12002431.html
- URL安全的Base64编码
- 温故而知新:设计模式之原型模式(Prototype)
- Windows 7上执行Cake 报错原因是Powershell 版本问题
- 温故而知新:类索引器
- Visual Studio Code 代理设置
- 温故而知新:设计模式之工厂模式(Factory)
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
- jquery.mobile手机网页简要
- 跟张志东深聊腾讯的“进化力”
- 详解微信小程序如何实现流程进度功能
- silverlight:如何在图片上挖个洞?
- .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
- mysqldump数据导出问题和客户端授权后连接失败问题
- Android置底一个View后运行报错
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kettle使用JavaScript代码处理数据
- Hadoop入门---(wordcount)统计单词出现的次数
- JS去除字符串的空格
- insertionSoft(插入排序) 2.1-1 And 重写insertionSoft 2.1-2
- Swagger-Springboot-mybatis-mysql
- Python+java+websocket+SpringMVC实时监控数据库中的表
- 基于Java图形界面的IPV4与网址的地址解析器
- 如何在千里之外能访问自己的电脑?(FRP)
- 三分钟Docker-镜像、容器实战篇
- 看懂今天这个!你就是个真正的javaer!
- 猿进化系列7——一文搞懂IO
- 猿进化系列13——一文搞懂MVC相关框架套路
- 猿进化系列16——实战之一学会SQL开发正确姿势
- 猿进化系列17——实战之一文学会前后端分离套路
- 基于Java的模拟写字板的设计与实现