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 都结束才返回

漏掉 AttachedToParentparent.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快速搭建网站?