0

0

c# TaskContinuationOptions 枚举有什么用

畫卷琴夢

畫卷琴夢

发布时间:2026-02-02 08:37:39

|

783人浏览过

|

来源于php中文网

原创

TaskContinuationOptions是控制延续任务执行时机、调度方式及与前置任务关联的关键枚举,必须显式指定以满足特定场景需求,如异常处理、同步执行、父子任务绑定等;默认None表示异步执行且不关心前置任务状态。

c# taskcontinuationoptions 枚举有什么用

TaskContinuationOptions 用来精确控制「延续任务(continuation)」何时执行、怎么调度、和前置任务如何关联。它不是可有可无的配置项,而是决定你 ContinueWith 行为是否符合预期的关键开关。

什么时候必须指定 TaskContinuationOptions

当你需要延续任务只在特定状态才运行(比如只处理异常),或要求它同步执行、绑定父任务生命周期、避免线程池争抢时,就必须显式传入。默认不传等价于 TaskContinuationOptions.None —— 它会异步执行、不关心前置任务成败、也不参与父子关系管理。

  • 前置任务失败了你还想记录日志?用 TaskContinuationOptions.NotOnRanToCompletion | TaskContinuationOptions.NotOnCanceled
  • 想让延续逻辑一定在同一线程跑(比如 UI 更新)?加 TaskContinuationOptions.ExecuteSynchronously(但注意:仅当前置任务已完成才生效,否则仍异步)
  • 写了一个嵌套子任务链,希望父任务 Wait() 时等所有子任务结束?必须用 TaskContinuationOptions.AttachedToParent

AttachedToParentDenyChildAttach 的真实作用

这两个选项管的是「任务树结构」,不是线程绑定。很多开发者误以为 AttachedToParent 能让子任务和父任务跑在同一个线程上 —— 实际完全无关。它只影响 Task.StatusWait() 行为:

Elser AI Comics
Elser AI Comics

一个免费且强大的AI漫画生成工具,助力你三步创作自己的一出好戏

下载
  • 父任务设了 AttachedToParent,它的 Status 不会变成 RanToCompletion 直到所有附加子任务也完成
  • 如果父任务用了 TaskCreationOptions.DenyChildAttach,那么子任务里再写 AttachedToParent 也会被无视,直接退化为独立任务
  • 错误示范:Task.Run(...).ContinueWith(..., AttachedToParent) —— 这里 ContinueWith 产生的任务不是「子任务」,AttachedToParent 无效(只有 new Task(..., AttachedToParent)Task.Factory.StartNew(..., AttachedToParent) 才触发父子关系)

常见踩坑点:位运算、条件组合与多任务延续

TaskContinuationOptions 是带 [Flags] 特性的枚举,支持按位或(|)组合多个行为,但不是所有组合都合理:

  • ExecuteSynchronously | NotOnFaulted 合法;但 ExecuteSynchronously | OnlyOnFaulted 可能导致延续根本没机会执行(因为异常发生时前置任务已非 Running 状态,同步执行条件不满足)
  • OnlyOnRanToCompletion 等「OnlyOnXxx」系列不能用于 ContinueWhenAllContinueWhenAny —— 多任务延续不支持这些条件,会抛 ArgumentException
  • 别把 PreferFairness 当成「保证顺序」:它只是给 TaskScheduler 的提示,实际调度仍取决于线程池负载和窃取策略
Task taskA = Task.Run(() => { throw new InvalidOperationException(); });
Task continuation = taskA.ContinueWith(t =>
{
    Console.WriteLine("我不会执行,因为用了 OnlyOnRanToCompletion");
}, TaskContinuationOptions.OnlyOnRanToCompletion); // 此延续被跳过

最常被忽略的一点:ContinueWith 默认是「火后不管」型延续 —— 前置任务一完成,延续就进队列,哪怕你没 await、没 Wait、也没保存引用,它照样可能执行(也可能被 GC 中断,取决于是否捕获异常)。要真正稳控流程,得结合 NotOnXxx 条件 + 显式等待 + 异常处理,而不是依赖默认行为。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

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

546

2023.08.10

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

267

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

168

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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