c# TaskCreationOptions 枚举有什么用
发布时间 - 2026-01-21 00:00:00 点击率:次TaskCreationOptions 是向 TaskScheduler 传递调度偏好的提示枚举,除 AttachedToParent 必被遵守外,其余选项如 LongRunning(启用独占线程防池阻塞)、PreferFairness(倾向全局队列)、DenyChildAttach(拒绝子任务附加)、HideScheduler(禁用调度器继承)均可能被忽略。
TaskCreationOptions 是给 Task 调度器的“建议纸”,不是命令书
它本质是一组 TaskCreationOptions 枚举值,用于向 TaskScheduler 传递调度偏好。但要注意:**绝大多数选项只是提示(hint),调度器可以忽略**——除了 AttachedToParent,这个一定会被遵守,因为它不依赖调度器逻辑,而是由 Task 运行时直接处理父子关系。
-
LongRunning:提示“这活儿要干很久”,调度器大概率会开一个**全新线程(非线程池线程)**来跑,避免卡住线程池 -
PreferFairness:让任务尽量进全局队列,减少本地队列饥饿,但实际公平性取决于当前TaskScheduler实现 -
DenyChildAttach:父任务主动“拒收”子任务的AttachedToParent请求,子任务自动降级为分离任务 -
HideScheduler:子任务不继承父任务的TaskScheduler,强制用TaskScheduler.Default
什么时候必须用 AttachedToParent?
当你需要父任务 Wait() 或 await 时**自动等待所有子任务完成**,而不是手动 Task.WaitAll(...),就必须加 AttachedToParent。
var parent = new Task(() =>
{
var child1 = new Task(() => Thread.Sleep(100), TaskCreationOptions.AttachedToParent);
var child2 = new Task(() => Thread.Sleep(200), TaskCreationOptions.AttachedToParent);
child1.Start();
child
2.Start();
});
parent.Start();
parent.Wait(); // ✅ 这里会等 child1 + child2 都结束才返回
漏掉 AttachedToParent?parent.Wait() 立刻返回,子任务可能还在后台跑——这是最常见的“以为等了其实没等” bug。
LongRunning 不是“性能优化开关”,而是资源隔离手段
别因为名字带 “Long” 就随便加。它的真实作用是:**防止长时间阻塞操作污染线程池**。
- 适用场景:
while(true) { ReadSensor(); Thread.Sleep(500); }类监控循环、同步 I/O 等待、或任何 > 1 秒且无法异步化的操作 - 反模式:用它包装一个
await HttpClient.GetAsync()—— 这是异步的,不该占专用线程 - 副作用:每个
LongRunning任务都新建线程,开多了会触发ThreadAbortException或内存压力
TaskFactory.CreationOptions 是“默认选项批发商”
如果你反复创建一堆行为一致的任务(比如全是 LongRunning + AttachedToParent),别每次都传参数,直接配工厂:
var factory = new TaskFactory(TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent); var t = factory.StartNew(() => DoWork()); // 自动带上两个 flag
注意:TaskFactory.CreationOptions 是只读属性,你只能在构造时指定;它不会影响已存在的任务,也不会覆盖你显式传入的 creationOptions 参数(后者优先级更高)。
最容易被忽略的一点:所有这些选项,只有在任务**真正被调度执行时**才起作用——如果任务还没 Start() 或被 await 挂起,它们只是静静躺在对象里,毫无意义。
# ai
# c#
# while
# 循环
# 继承
# 堆
# 线程
# Thread
# 对象
# default
# 异步
# 性能优化
# bug
# 这是
# 如果你
# 还没
# 还在
# 什么时候
# 是由
# 当你
# 长时间
# 很久
# 躺在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
jquery插件bootstrapValidator表单验证详解
微信公众帐号开发教程之图文消息全攻略
EditPlus中的正则表达式实战(6)
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
如何在宝塔面板创建新站点?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
打造顶配客厅影院,这份100寸电视推荐名单请查收
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel如何实现文件上传和存储?(本地与S3配置)
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Swift中循环语句中的转移语句 break 和 continue
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel怎么调用外部API_Laravel Http Client客户端使用
node.js报错:Cannot find module 'ejs'的解决办法
如何在阿里云域名上完成建站全流程?
如何用已有域名快速搭建网站?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何快速搭建支持数据库操作的智能建站平台?
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何在阿里云虚拟服务器快速搭建网站?
EditPlus 正则表达式 实战(3)
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Bootstrap整体框架之CSS12栅格系统
QQ浏览器网页版登录入口 个人中心在线进入
黑客如何通过漏洞一步步攻陷网站服务器?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
详解jQuery中的事件
如何实现javascript表单验证_正则表达式有哪些实用技巧
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel如何实现数据库事务?(DB Facade示例)
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Python图片处理进阶教程_Pillow滤镜与图像增强
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何在搬瓦工VPS快速搭建网站?


