0

0

c# Task Parallel Library (TPL) 的核心组件有哪些

月夜之吻

月夜之吻

发布时间:2026-01-15 09:04:02

|

850人浏览过

|

来源于php中文网

原创

Task 是 TPL 基础执行单元,代表可能异步完成的操作;优先用 Task.Run 而非 new Task().Start();默认不捕获同步上下文,需 ConfigureAwait(true) 回 UI;TaskScheduler 控制调度策略;Parallel 和 PLINQ 提供高层并行封装,但各有适用场景与限制。

c# task parallel library (tpl) 的核心组件有哪些

Task 类是 TPL 的基础执行单元

所有异步工作最终都封装在 TaskTask 实例中。它不等同于线程,而是“一个可能异步完成的操作”的抽象——可以由线程池线程、IOCP、甚至同步执行(比如 Task.FromResult(42))来完成。

常见误区是认为 new Task(...).Start() 是推荐写法,实际上应优先用静态工厂方法:

Task.Run(() => DoWork());           // 推荐:自动调度到线程池
Task.Factory.StartNew(() => DoWork()); // 较老 API,需注意默认调度器和参数重载歧义
Task.CompletedTask;                  // 零开销已完成任务,替代 Task.FromResult(())

注意:Task 默认不捕获同步上下文(如 UI 线程),若需回到原始上下文(如 WinForms/WPF 更新控件),得显式用 await task.ConfigureAwait(true)

TaskScheduler 控制任务如何排队与执行

TaskScheduler 是任务调度策略的抽象。默认是 ThreadPoolTaskScheduler,但你可以自定义,比如实现单线程调度器用于串行化 UI 相关操作,或限制并发数的调度器。

关键点:

  • TaskScheduler.Current 返回当前上下文的调度器(常用于 Task.Factory.StartNewtaskScheduler: 参数)
  • TaskScheduler.Default 指向线程池调度器
  • 自定义调度器必须重写 QueueTaskGetScheduledTasks(后者仅调试用途,可抛 NotSupportedException

不要直接 new 一个 TaskScheduler 并调用 QueueTask——它不保证执行,只是入队;真正触发执行依赖调度器内部循环或外部驱动(如 Windows 消息泵)。

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载

Parallel 类提供数据并行的高层封装

Parallel.ForParallel.ForEachParallel.Invoke 是面向集合/范围的并行构造,底层仍基于 Task,但自动处理分区、负载均衡、异常聚合(抛 AggregateException)。

使用时注意:

  • 迭代体必须是无副作用或线程安全的;不要在循环里直接修改共享变量,改用 ParallelOptions.MaxDegreeOfParallelism 限流或 ConcurrentBag 等线程安全集合
  • Parallel.ForEach(source, item => { ... }) 中的 source 若是 IEnumerable,每次枚举都重新遍历——避免传入含副作用的迭代器(如数据库游标)
  • 它不返回结果集;需要结果请改用 PLINQ(AsParallel().Select(...).ToArray()

PLINQ 是 Parallel + LINQ,不是独立组件而是 TPL 的查询扩展

AsParallel()IEnumerable 转为 ParallelQuery,后续 LINQ 操作(WhereSelectSum 等)自动并行化。但它不是万能加速器:

  • 小数据集(x => x * 2)反而因分区开销变慢
  • 顺序敏感操作(如 First()Take(1))会退化为部分并行,且结果不保证稳定
  • 必须显式调用 AsOrdered() 才保持源顺序,但代价是降低吞吐量

错误示例:list.AsParallel().Select(x => riskySideEffect()).ToList() —— 副作用无法预测执行时机和次数,极易引发竞态。

真正难的不是记住这些组件名,而是判断该用 Task.Run 还是 Parallel.ForEach,或者干脆避开 TPL 改用 ValueTaskIAsyncEnumerable。线程调度、上下文捕获、异常传播、取消令牌传递——每个环节漏掉一个细节,都会让并行逻辑在高负载下间歇性失败。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

42

2025.12.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.12.07

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

576

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1099

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

790

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

452

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2347

2023.08.08

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Excel 教程
Excel 教程

共162课时 | 11.8万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号