System.Threading.Tasks 是 .NET 中任务并行库(Task Parallel Library, TPL)的核心组件,它提供了基于任务的异步编程模型,是现代 .NET 并发编程的基础。

设计原理

1. 核心目标

  • 抽象并发工作:将并发操作抽象为"任务"概念

  • 资源高效利用:自动管理线程池资源

  • 组合性:支持任务链式操作和组合

  • 取消支持:内置取消操作机制

  • 状态跟踪:提供任务生命周期管理

2. 关键组件

  • Task/Task<T>:表示异步操作的核心类

  • TaskScheduler:控制任务如何、何时被执行

  • TaskFactory:提供创建和启动任务的便捷方法

  • CancellationToken:任务取消机制

  • TaskCompletionSource:手动控制任务生命周期

3. 架构层次

  1. 用户层:开发者直接使用的Task API

  2. 调度层:TaskScheduler管理任务执行

  3. 线程池层:实际执行工作的底层线程池

典型用法示例

示例1:基础异步任务

// 创建并运行简单任务
Task.Run(() => 
{Console.WriteLine("任务在后台线程执行");Thread.Sleep(1000); // 模拟工作Console.WriteLine("任务完成");
});// 带返回值的任务
Task<int> calculateTask = Task.Run(() => 
{Thread.Sleep(500);return 42; // 计算结果
});// 等待任务完成并获取结果
int result = await calculateTask;
Console.WriteLine($"计算结果: {result}");

应用场景:CPU密集型后台计算,不阻塞UI线程。

示例2:任务组合与延续

// 创建三个任务
Task<string> task1 = Task.Run(() => "Hello");
Task<string> task2 = Task.Run(() => "World");
Task<int> task3 = Task.Run(() => 2023);// 等待所有任务完成
await Task.WhenAll(task1, task2, task3);// 使用结果组合输出
Console.WriteLine($"{task1.Result} {task2.Result} {task3.Result}");// 任务延续
Task continuation = task1.ContinueWith(t => 
{Console.WriteLine($"前一个任务的结果: {t.Result}");
}, TaskContinuationOptions.OnlyOnRanToCompletion);

应用场景:并行执行多个独立操作,然后合并结果或执行后续操作。

示例3:高级任务控制

// 使用TaskCompletionSource手动控制任务
var tcs = new TaskCompletionSource<string>();// 模拟异步回调
Timer timer = new Timer(_ => 
{try{// 模拟工作string result = DateTime.Now.ToString();tcs.SetResult(result); // 手动完成任务}catch (Exception ex){tcs.SetException(ex); // 手动设置异常}
}, null, 1000, Timeout.Infinite);// 等待任务完成
try
{string timeString = await tcs.Task;Console.WriteLine($"当前时间: {timeString}");
}
catch (Exception ex)
{Console.WriteLine($"任务失败: {ex.Message}");
}

应用场景:将基于回调的异步API转换为基于任务的异步模式(TAP)。

示例4:取消任务

var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;// 创建可取消的任务
Task longRunningTask = Task.Run(() => 
{for (int i = 0; i < 100; i++){token.ThrowIfCancellationRequested(); // 检查取消请求Thread.Sleep(100); // 模拟工作Console.WriteLine($"进度: {i}%");}
}, token);// 3秒后取消任务
cts.CancelAfter(3000);try
{await longRunningTask;
}
catch (OperationCanceledException)
{Console.WriteLine("任务被取消");
}

应用场景:长时间运行的操作需要提供取消功能。

核心概念深入

1. 任务状态机

任务有以下几种状态:

  • Created:已创建但未调度

  • WaitingForActivation:等待激活

  • WaitingToRun:已调度但未开始执行

  • Running:正在执行

  • WaitingForChildrenToComplete:等待子任务完成

  • RanToCompletion:成功完成

  • Canceled:被取消

  • Faulted:因异常失败

2. 任务调度策略

  • 线程池调度器:默认调度器,使用线程池线程

  • 同步上下文调度器:在特定同步上下文(如UI线程)执行

  • 自定义调度器:可继承TaskScheduler实现特殊调度逻辑

3. 异常处理

任务中的异常会被捕获并存储在 Task.Exception 属性中,当等待任务或访问Result属性时,这些异常会被重新抛出。

Task faultyTask = Task.Run(() => throw new InvalidOperationException("出错了"));try
{await faultyTask;
}
catch (InvalidOperationException ex)
{Console.WriteLine($"捕获到异常: {ex.Message}");
}

最佳实践

  1. 避免Task.Wait和Task.Result:可能导致死锁,优先使用await

  2. 合理使用ConfigureAwait:库代码应使用ConfigureAwait(false)

  3. 注意任务生命周期:长时间运行的任务应考虑取消支持

  4. 避免过度并行化:太多并行任务会导致线程池饥饿

  5. 正确处理异常:确保所有任务异常都被处理

性能考虑

  • 任务创建开销:轻量级但非零成本,高频场景考虑对象池

  • 线程池压力:大量短任务可能导致线程池频繁调整

  • 同步上下文:不必要地回到原始上下文会影响性能

System.Threading.Tasks 提供了强大而灵活的并发编程模型,是现代 .NET 应用程序中处理异步和并行操作的首选方式。

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

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

相关文章

Python爬虫实战:研究jieba相关技术

1. 引言 1.1 研究背景与意义 随着互联网技术的飞速发展,网络新闻已成为人们获取信息的主要渠道之一。每天产生的新闻文本数据量呈爆炸式增长,如何从海量文本中高效提取有价值的信息,成为信息科学领域的重要研究课题。文本分析技术通过对文本内容的结构化处理和语义挖掘,能…

github 淘金技巧

1. 效率&#xff0c;搜索&#xff0c;先不管。后面再说。 2. 分享的话&#xff0c; 其实使用默认的分享功能也行。也是后面再说。此 app &#xff0c; 今天先做到这里。 下面我们再聊点其他东西。其实我还想问&#xff0c;这个事情&#xff0c;其他人是否也做了&#xff0c; ht…

RAG技术发展综述

摘要 检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术已成为大语言模型应用的核心技术栈。RAG有效解决了LLM的幻觉问题、知识截止和实时更新挑战&#xff0c;目前正处于全面产业化阶段。本文系统性地分析RAG的全栈技术架构&#xff0c;包括检索…

集群聊天服务器---muduo库(3)

使用muduo网络库进行编译和链接的示例 项目的目录结构 bin: 存放可执行文件。 lib: 存放库文件。 include: 存放头文件。 src: 存放源代码文件。 build: 存放编译生成的中间文件。 example: 存放示例代码。 thirdparty: 存放第三方库。 CMakeLists.txt: CMake构建系统…

双核SOC/5340 应用和网络核间通讯

1&#xff1a; 可以在 nRF Connect SDK 文件夹结构的 samples/ipc/ipc_service 下找到示例&#xff0c;应用和网络核心在由 CONFIG_APP_IPC_SERVICE_SEND_INTERVAL 选项指定的时隙内相互发送数据。可以更改该值并观察每个核心的吞吐量如何变化 nRF5340 DK 可以使用 RPMsg 或 IC…

Spring Cloud Ribbon核心负载均衡算法详解

Ribbon 作为 Spring Cloud 生态中的客户端负载均衡工具&#xff0c;提供多种动态负载均衡算法&#xff0c;根据后端服务状态智能分配请求。其核心算法及适用场景如下&#xff1a; &#x1f9e0; 一、Ribbon 负载均衡算法 算法名称工作原理引用来源轮询 (RoundRobinRule)按服务…

网站图片过于太大影响整体加载响应速度怎么办? Typecho高级图像处理插件

文章目录 LeleImges - Typecho高级图像处理插件 🖼️插件介绍 📝插件架构 🏗️主要功能 ✨性能优势 🚀系统要求 📋安装方法 📥详细配置说明 ⚙️图片质量设置 🎚️最大宽度/高度限制 📏压缩格式选择 🗜️压缩方法选择 🔧GIF处理方式 🎞️备份源文件 💾…

VUE3入门很简单(1)--- 响应式对象

前言 重要提示&#xff1a;文章只适合初学者&#xff0c;不适合专家&#xff01;&#xff01;&#xff01; 什么是响应式对象&#xff1f; 在Vue3中&#xff0c;响应式对象就是这种智能温控器。当你修改JavaScript对象的数据时&#xff0c;Vue会自动更新网页上显示的内容&am…

广州华锐互动携手中石油:AR 巡检系统实现重大突破​

广州华锐互动在 AR 技术领域的卓越成就&#xff0c;通过一系列与知名企业、机构的成功合作案例得以充分彰显。其中&#xff0c;与中石油的合作项目堪称经典&#xff0c;展现了广州华锐互动运用 AR 技术解决实际难题、达成目标的强大实力。​ 中石油作为能源行业的巨擘&#xff…

权威认证!华宇TAS应用中间件荣获CCRC“中间件产品安全认证”

近日&#xff0c;华宇TAS应用中间件顺利通过了中国网络安全审查认证和市场监管大数据中心(CCRC)的信息安全认证&#xff0c;获得了IT产品信息安全认证证书。此次获证&#xff0c;标志着华宇TAS应用中间件在安全性、可靠性及合规性等方面达到行业领先水平&#xff0c;可以为政企…

BI财务分析 – 反映盈利水平利润占比的指标如何分析(下)

之前的文章重点把构成销售净利率、主营业务利润率、成本费用利润率、营业利润率、销售毛利率的分母像销售收入、营业收入、主营业务收入净额、成本费用总额做了比较细致的说明&#xff0c;把这几个基本的概念搞明白后&#xff0c;再来看这几个指标就比较容易理解了。 销售净利…

竹云受邀出席华为开发者大会,与华为联合发布海外政务数字化解决方案

6月20日-22日&#xff0c;华为开发者大会&#xff08;HDC 2025&#xff09;在东莞松山湖盛大召开。作为华为一年一度面向全球开发者的顶级科技盛会&#xff0c;今年的HDC不仅带来了HarmonyOS 6.0 Beta版本、盘古大模型5.5等多项重磅技术和产品更新&#xff0c;更聚集了全球极客…

AI助力游戏设计——从灵感到行动-靠岸篇

OK&#xff0c;朋友&#xff0c;如果你到了这里&#xff0c;那就证明这趟旅程&#xff0c;快要到岸了。 首先&#xff0c;恭喜你&#xff0c;到了需要这一步的时候。其实&#xff0c;如果你有一天真的用到了&#xff0c;希望你可以回来打个卡。行了&#xff0c;不废话&#xf…

vue将页面导出pdf,vue导出pdf ,使用html2canvas和jspdf组件

vue导出pdf 需求&#xff1a;需要前端下载把当前html下载成pdf文件–有十八页超长&#xff0c;之前使用vue-html2pdf组件&#xff0c;但是这个组件有长度限制和比较新浏览器版本限制&#xff0c;所以改成使用html2canvas和jspdf组件 方法&#xff1a; 1、第一步&#xff1a;我…

024 企业客户管理系统技术解析:基于 Spring Boot 的全流程管理平台

企业客户管理系统技术解析&#xff1a;基于Spring Boot的全流程管理平台 在企业数字化转型的浪潮中&#xff0c;高效的客户管理系统成为提升企业竞争力的关键工具。本文将深入解析基于Java和Spring Boot框架构建的企业客户管理系统&#xff0c;该系统涵盖员工管理、客户信息管…

JavaScript性能优化代码示例

JavaScript性能优化实战大纲 性能优化的核心目标 减少加载时间、提升渲染效率、降低内存占用、优化交互响应 代码层面的优化实践 避免全局变量污染&#xff0c;使用局部变量和模块化开发 减少DOM操作频率&#xff0c;批量处理DOM更新 使用事件委托替代大量事件监听器 优化循…

树的重心(双dfs,换根)

思路&#xff1a; 基于树形 DP 的两次遍历&#xff08;第一次dfs计算以某个初始根&#xff08;这里选了 1&#xff09;为根时各子树的深度和与节点数&#xff0c;第二次zy进行换根操作&#xff0c;更新每个节点作为根时的深度和&#xff09; 换根原理&#xff1a; 更换主根&…

官方App Store,直链下载macOS ,无需Apple ID,macOS10.10以上.

前言 想必很多人都有过维修老旧Mac的体验,也有过想要重装macos的体验. 尤其是前者,想要重装或者升级系统,由于官方已经无法更新,必须下载iSo镜像 这时就会遇到死循环:想要更新macOS ,必须先使用更高版本的App Store,但要使用更高版本的App Store,必须先更新macOS !!! 如果想…

芋道生成前端界面代码详解

一、搜索框 1、整体架构 <ContentWrap> ... </ContentWrap><ContentWrap> 是页面布局容器&#xff08;可能是自定义组件&#xff09;&#xff0c;包裹住页面的内容区域。 2、el-form 表单&#xff08;搜索区域&#xff09; 2.1参数 <el-formclass&quo…

小程序入门:推广技巧与运行数据查看解析

在当今数字化时代&#xff0c;小程序的应用愈发广泛&#xff0c;无论是企业还是个人开发者&#xff0c;都希望自己的小程序能够获得更多用户关注并顺利运行。本文将详细介绍小程序发布的流程、推广策略以及如何查看运行数据&#xff0c;助力开发者更好地运营小程序。 一、小程…