【.NET Core】Task应用详解
【.NET Core】Task应用详解
文章目录
- 【.NET Core】Task应用详解
- 一、概述
- 二、Task用法应用
- 2.1 通过New实例化Task
- 2.2 通过Factory中StartNew方法
- 2.3 通过Run方法
- 三、让Task任务按顺序执行
- 四、通过异步Run方法异步执行顺序Task
- 五、创建带有返回值的Task<TResult>
- 六、Task常用的属性与方法
- 七、Task总结
- 七、参考资料
一、概述
Task(任务)是一个类似于Thead(线程)或ThreadPool(线程池)概念是一个异步执行的工具类。它是一个更轻的类线程工具。Task提供简化编写并发和异步代码的工具类。它包含的类型为Task和Task<TResult>。TaskFactory类提供用于创建和启动Task任务的静态方法。TaskScheduler类提供默认线程调度基础结构。
Task表示不返回值且通常异步执行的单个操作。Task对象是.NET Framework4中首次引入的基于任务的异步模式的核心组件之一。由于对象执行Task的工作通常在线程池线程上异步执行,而不是在main应用程序线程上同步执行,因此可以使用Statu属性以及IsCanceled、IsCompleted和IsFaulted属性来确定任务的状态。
二、Task用法应用
Task基本使用可以通过New实例化一个Task的应用,也使用通过StartNew来使用Task,还有一种是通过Run使用Task。下面实例通过代码演示三种Task基本的应用。
2.1 通过New实例化Task
Task task1=new Task(()=>{Thread.Sleep(1000);Debug.WriteLine("执行第一个Task任务.")
});
Debug.WriteLine($"Task ID"+task1.id)
输出结果:
线程 0x6704 已退出,返回值为 0 (0x0)。
第一个任务ID13
执行第一个Task任务
2.2 通过Factory中StartNew方法
Task task2=new Task(()=>{Thread.Sleep(1500);Debug.WriteLine("执行第二个Task任务.")
});
Debug.WriteLine($"Task2 ID"+task2.id);
2.3 通过Run方法
Task task3=new Task(()=>{Thread.Sleep(2000);Debug.WriteLine("执行第三个Task任务.");
})
Debug.WriteLine($"Task3 ID"+task3.id);
上面三种方法都可以创建一个Task应用。
类Task提供的异常三种创建任务和执行任务的方法。出于性能原因,Task.Run或TaskFactory.StartNew方法是创建和计划计算任务的首选机制,但对于必须分离创建和计划的方案,才考虑使用Task.Start方法计划任务以供以后执行。
三、让Task任务按顺序执行
Task task1 = new Task(() => { Thread.Sleep(1000);Debug.WriteLine("执行第一个Task任务");
});
Task task2 = new Task(() => {Thread.Sleep(5000);Debug.WriteLine("执行第二个Task任务");
});
Task task3 = new Task(() => {Thread.Sleep(2000);Debug.WriteLine("执行第三个Task任务");
});
Task task4 = new Task(() => {Thread.Sleep(1000);Debug.WriteLine("执行第四个Task任务");
});IList<Task> tasks= new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);
tasks.Add(task4);
foreach (var task in tasks) {task.Start();task.Wait();
}
如果想要Task按顺序执行,需要给Task加上Wait方法,然后让其阻塞等待完成后在执行下一个Task任务。
四、通过异步Run方法异步执行顺序Task
public async void RunTask() {await Task.Run(async () =>{await Task.Delay(1000);Debug.WriteLine("第1个线程执行");});await Task.Run(async () =>{await Task.Delay(8000);Debug.WriteLine("第2个线程执行");});await Task.Run(async () =>{await Task.Delay(2000);Debug.WriteLine("第3个线程执行");});await Task.Run(async () =>{await Task.Delay(3000);Debug.WriteLine("第4个线程执行");});
}
通过异步await 和async通过 Task.Run创建按次序的Task任务。
五、创建带有返回值的Task
Task和Task暴露静态的Factory属性,该属性返回一个默认的TaskFactory实例,以便调用Task.Factory.StartNew()方法。Task和Taste有一个属性Result属性,该属性包含了运算的结果。任务是异步运行的,可能以任意时序执行完。若Result属性在运行结束前被访问,这个属性会阻塞调用线程到该值可访问。
public async void RunTask()
{Task<Double>[] taskArray = { Task<Double>.Factory.StartNew(() => DoComputation(10.0)),Task<Double>.Factory.StartNew(() => DoComputation(100.0)),Task<Double>.Factory.StartNew(() => DoComputation(1000.0)) };foreach (var task in taskArray){double result = task.Result;Debug.WriteLine(result);}
}
六、Task常用的属性与方法
6.1 AsyncStates属性
获取在创建Task时提供的状态对象,如果未提供,则为null。
6.2 CompletedTask属性
获取一个已成功的任务
6.2 CurrentId属性
返回当前正在执行Task的ID
6.3 Factory属性
提供对用于创建和配置Task和Task实例的工厂方法的访问
6.4 Id属性
获取此Task实例的ID
6.5 IsCanceled属性
获取此Task实例是否由于被取消的原因而完成执行
6.6 IsCompleted属性
获取一个值,它表示是否已完成任务
6.7 IsCompletedSuccessfully属性
了解任务是否运行到完成
6.7 IsFaulted属性
获取Task是否由于未经处理异常的原因而完成
6.8 Status属性
表示Task的生命周期中的当前阶段
-
0 = Created 该任务已初始化,但尚未被计划
-
1 = WaitingForActivation 该任务正在等待 .NET 基础结构在内部将其激活并进行计划。
-
2 = WaitingToRun 该任务已被计划执行,但尚未开始执行
-
3 = Running 该任务正在运行,但尚未完成
-
4 = WaitingForChildrenToComplete 该任务已完成执行,正在隐式等待附加的子任务完成
-
5 = RanToCompletion 已成功完成执行的任务
-
6 = Canceled 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号
-
7 = Faulted 由于未处理异常的原因而完成的任务
6.9 ConfigureAwait(Boolean) 方法
配置用于等待此Task的awaiter
6.10 ContinueWith(Action<Task,Object>,Object,TaskScheduler) 方法
创建一个在目标Task完成时接收调用方提供的状态信息和取消标记并执行的延续任务。延续任务根据一组指定的条件执行,并使用指定的计划程序。
6.11 Delay(TimeSpan,CancellationToken) 方法
创建一个在指定的毫秒数后完成的可取消任务或创建一个指定的时间间隔后完成的可取消的任务。
6.12 Run(Action,CancellationToken) 方法
将在线程池上运行的指定工作排队,并返回代表该工作的 Task对象。 可使用取消标记来取消工作(如果尚未启动)。
6.13 Start(TaskScheduler) 方法
启动Task, 并将它安排到当前的TaskScheduler中执行
6.14 Wait(Task[],CancellationToken) 方法
等待提供的所有Task对象在指定的毫秒数内完成执行,或等到取消等待
6.15 Yield()方法
创建异步产生当前上下文的等待任务。
七、Task总结
Task是并行编程的一个重要的特性,主要的特点有一下几点:
- 底层是在线程池中运作的,且微软用了一些增强性能的算法(这点使你在大部分场景中可以无忧地使用它)
- 实际使用往往会结合lambda表达式
- 结合lambda表达式在循环中使用计数器时,需要注意lambda内使用计数器是其引用。可以使用自定义传参给任务来回避这种情况
在实际的开发中还需要根据实际的应用场景,选项合适的属性和方法,希望你通过本文能完全掌握Task的应用。
七、参考资料
https://learn.microsoft.com/zh-cn/dotnet/standard/parallel-programming/task-parallel-library-tpl
相关文章:
【.NET Core】Task应用详解
【.NET Core】Task应用详解 文章目录 【.NET Core】Task应用详解一、概述二、Task用法应用2.1 通过New实例化Task2.2 通过Factory中StartNew方法2.3 通过Run方法 三、让Task任务按顺序执行四、通过异步Run方法异步执行顺序Task五、创建带有返回值的Task<TResult>六、Task…...
convertRect:toView 方法注意事项
这是在网上找到的一张图 我们开发中有时候会用到左边转换,convertRect:toView 通常情况下,我们回这样使用 CGRect newRect [a convertRect:originframe toView:c];其中newRect和 originframe的size相同,只改变origin newRect.origin a…...
Java实现王者荣耀小游戏
主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…...
【黑马甄选离线数仓day04_维度域开发】
1. 维度主题表数据导出 1.1 PostgreSQL介绍 PostgreSQL 是一个功能强大的开源对象关系数据库系统,它使用和扩展了 SQL 语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。 官方网址:PostgreSQL: The worlds most advanced open s…...
C# 中using关键字的使用
在C#中我们还是很有必要掌握using关键字的。 比如这样: string path “D:\data.txt”; if (!File.Exists(path )) {File.Create(path); File.WriteAllText(path,"OK"); } 首先我创建…...
16 redis高可用读写分离方案
在前面说的JedisSentinelPool只能实现主从的切换,而无法实现读写的分离。 1.哨兵的客户端实现主从切换方案 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</arti…...
Nginx模块开发之http handler实现流量统计(2)
文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计(1)】使用数组在单进程实现了IP的流量统计&a…...
案例012:Java+SSM+uniapp基于微信小程序的科创微应用平台设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
vue3+elementPlus登录向后端服务器发起数据请求Ajax
后端的url登录接口 先修改main.js文件 // 导入Ajax 前后端数据传输 import axios from "axios"; const app createApp(App) //vue3.0使用app.config.globalProperties.$http app.config.globalProperties.$http axios app.mount(#app); login.vue 页面显示部分…...
存储区域
将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并在内存中为这些段分配空间。 栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。 进…...
C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)
前言 我们在开发串口通信程序时,有时候会遇到比如单片机或者传感器发送的数据速度特别快,比如10ms、20ms发送一次,并且每次发送的数据量还比较大,如果按照常规的写法,我们会发现接收的数据还没处理完,新的数据又发送过来了,这就会导致处理数据滞后,软件始终处理的不是…...
Redis-Redis高可用集群之水平扩展
Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展,原始集群(见下图)由6个节点组成,6个节点分布在三…...
2023全球数字贸易创新大赛-人工智能元宇宙-4-10
目录 竞赛感悟: 创业的话 好的项目 数字工厂,智慧制造:集群控制的安全问题...
go defer用法_类似与python_java_finially
defer 执行 时间 defer 一般 定义在 函数 开头, 但是 他会 最后 被执行 A defer statement defers the execution of a function until the surrounding function returns. 如果说 为什么 不在 末尾 定义 defer 呢, 因为 当 错误 发生时, 程序 执行 不到 末尾 就会 崩溃. d…...
Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:
背景 将 -Dlog4j.debug 添加到IDEA的类的启动配置中 运行上图代码,这里log4j2.xml控制的日志级别是info,很明显是没生效。 DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory is not on classpath. Good! DEBUG StatusLogger Using Shutdow…...
【LeetCode】挑战100天 Day14(热题+面试经典150题)
【LeetCode】挑战100天 Day14(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-162.1 题目2.2 题解 三、面试经典 150 题-163.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&…...
VMware安装windows操作系统
一、下载镜像包 地址:镜像包地址。 找到需要的版本下载镜像包。 二、安装 打开VMware新建虚拟机,选择用镜像文件。将下载的镜像包加载进去即可。...
历时半年,我发布了一款习惯打卡小程序
半年多前,我一直困扰于如何记录习惯打卡情况,在参考了市面上绝大多数的习惯培养程序后,终于创建并发布了这款习惯打卡小程序。 “我的小日常打卡”小程序主要提供习惯打卡和专注训练功能。致力于培养用户养成一个个好的习惯,改掉…...
被DDOS了怎么办 要如何应对
DDoS攻击的特点和类型 1. 特点 DDoS攻击的特点是通过大量合法的请求或者无效的请求,消耗目标服务器的网络带宽和系统资源,使其无法正常运行。攻击者通常使用多个主机发起攻击,以达到更高的攻击效果。 2. 常见类型 (1)S…...
时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
一、本文介绍 本文给大家带来的实战内容是利用PyTorch实现LSTM-GRU模型,LSTM和GRU都分别是RNN中最常用Cell之一,也都是时间序列预测中最常见的结构单元之一,本文的内容将会从实战的角度带你分析LSTM和GRU的机制和效果,同时如果你…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
