首页 > 编程语言 >C#后续任务条件参数:TaskContinueOption --枚举类型

C#后续任务条件参数:TaskContinueOption --枚举类型

时间:2022-11-29 21:02:30浏览次数:58  
标签:选项 前面 C# 延续 指定 -- 任务 TaskContinueOption 运行

一、概述

  一个线程可以有多个任务,一个任务也可以包含多个任务。把一个任务附加给另一个任务,就需要用到ContinueWith()。

  该方法是Task类中的方法,有多个重载,其中最基本的参数除了任务之外,还得有TaskContinueOption。常用方法如下:

t2.ContinueWith(innerTask => Console.WriteLine(innerTask.Result),
                    TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.NotOnFaulted);

 

二、结构

 1、在代码中的结构

 

2、具体含义

 

AttachedToParent 4

如果延续为子任务,则指定将延续附加到任务层次结构中的父级。 只有当延续前面的任务也是子任务时,延续才可以是子任务。 默认情况下,子任务(即由外部任务创建的内部任务)将独立于其父任务执行。 可以使用 AttachedToParent 选项以便将父任务和子任务同步。

请注意,如果使用 DenyChildAttach 选项配置父任务,则子任务中的 AttachedToParent 选项不起作用,并且子任务将作为分离的子任务执行。

有关详细信息,请参阅附加和分离的子任务

DenyChildAttach 8

指定任何使用 AttachedToParent 选项创建,并尝试作为附加的子任务执行的子任务(即,由此延续创建的任何嵌套内部任务)都无法附加到父任务,会改成作为分离的子任务执行。 有关详细信息,请参阅附加和分离的子任务

ExecuteSynchronously 524288

指定应同步执行延续任务。 指定此选项后,延续任务在导致前面的任务转换为其最终状态的相同线程上运行。 如果在创建延续任务时已经完成前面的任务,则延续任务将在创建此延续任务的线程上运行。 如果前面任务的 CancellationTokenSource 已在一个 finally(在 Visual Basic 中为 Finally)块中释放,则使用此选项的延续任务将在该 finally 块中运行。 只应同步执行运行时间非常短的延续任务。

由于任务以同步方式执行,因此无需调用诸如 Wait() 的方法来确保调用线程等待任务完成。

HideScheduler 16

指定由延续通过调用方法(如 Run(Action) 或 ContinueWith(Action<Task>))创建的任务将默认计划程序 (Default) 视为当前的计划程序,而不是正在运行该延续的计划程序。

LazyCancellation 32

在延续取消的情况下,防止延续的完成直到完成先前的任务。

LongRunning 2

指定延续将是长期运行的、粗粒度的操作。 它会向 TaskScheduler 提示,过度订阅可能是合理的。

None 0

如果未指定延续选项,应在执行延续任务时使用指定的默认行为。 延续任务在前面的任务完成后以异步方式运行,与前面任务最终的 Status 属性值无关。 如果延续是子任务,则会将其创建为分离的嵌套任务。

NotOnCanceled 262144

指定不应在延续任务前面的任务已取消的情况下安排延续任务。 如果前面任务完成的 Status 属性是 Canceled,则前面的任务会取消。 此选项对多任务延续无效。

NotOnFaulted 131072

指定不应在延续任务前面的任务引发了未处理异常的情况下安排延续任务。 如果前面任务完成的 Status 属性是 Faulted,则前面的任务会引发未处理的异常。 此选项对多任务延续无效。

NotOnRanToCompletion 65536

指定不应在延续任务前面的任务已完成运行的情况下安排延续任务。 如果前面任务完成的 Status 属性是 RanToCompletion,则前面的任务会运行直至完成。 此选项对多任务延续无效。

OnlyOnCanceled 196608

指定只应在延续前面的任务已取消的情况下安排延续任务。 如果前面任务完成的 Status 属性是 Canceled,则前面的任务会取消。 此选项对多任务延续无效。

OnlyOnFaulted 327680

指定只有在延续任务前面的任务引发了未处理异常的情况下才应安排延续任务。 如果前面任务完成的 Status 属性是 Faulted,则前面的任务会引发未处理的异常。

OnlyOnFaulted 选项可保证前面任务中的 Exception 属性不是 null。 你可以使用该属性来捕获异常,并确定导致任务出错的异常。 如果你不访问 Exception 属性,则不会处理异常。 此外,如果尝试访问已取消或出错的任务的 Result 属性,则会引发一个新异常。

此选项对多任务延续无效。

OnlyOnRanToCompletion 393216

指定只应在延续任务前面的任务已完成运行的情况下才安排延续任务。 如果前面任务完成的 Status 属性是 RanToCompletion,则前面的任务会运行直至完成。 此选项对多任务延续无效。

PreferFairness 1

提示 TaskScheduler 按任务计划的顺序安排任务,因此较早安排的任务将更可能较早运行,而较晚安排运行的任务将更可能较晚运行。

RunContinuationsAsynchronously 64

指定应异步运行延续任务。 此选项优先于 ExecuteSynchronously

 

3、结合按位或 | 运算符使用

  因为ContinueWith应用的广泛性,有可能需要不止一个状态条件,例如:

//只使用一个条件
Task t2 = t.ContinueWith(task => Console.WriteLine(t.Result), TaskContinuationOptions.NotOnFaulted);

//使用两个或多个条件
 Task continuation = secondsTask.ContinueWith(t =>Console.WriteLine($"{CurrentThread.ManagedThreadId},{CurrentThread.IsThreadPoolThread}")
            , TaskContinuationOptions.OnlyOnRanToCompletion|TaskContinuationOptions.ExecuteSynchronously);

  把TaskContinuationOption中状态条件对应的值转换成二进制后,

 

标签:选项,前面,C#,延续,指定,--,任务,TaskContinueOption,运行
From: https://www.cnblogs.com/Darius0821/p/16599430.html

相关文章

  • 练习_for循环创建用户
    #!/usr/bin/bashread-p"pleaseinputnumber:"numif[[!"$num"=~^[0-9]+$]];thenecho"errornumber"exitfiread-p"pleaseinputpref......
  • python四十四期---
    昨日内容回顾多表查询的两种方式连表操作 innerjoin leftjoin rightjoin ps:所需结论来自于多张表的字段建议使用连表子查询 将SQL语句括号括起来当做另外......
  • MySQL设置事务自动提交
    MySQL默认开启事务自动提交模式,即除非显式的开启事务(BEGIN或STARTTRANSACTION),否则每条SOL语句都会被当做一个单独的事务自动执行。但有些情况下,我们需要关闭事务自动......
  • KCTF-病疫先兆
    一道爆破题,我不理解为什么不把这题放在第二个ida打开先对输入做了分割,分成了三部分看到下面对中间部分做了校验,得到第一部分KCTF剩下两部分都用到了随机数,随机数的种......
  • .NET6之MiniAPI(二十三):Refit
    本篇是与上篇HttpClient有关联的,有前篇中,我们是直接使用HttpClient来发出请求的,所有的请求信息都是我们根据需要自己来填充的。那Refit是什么呢?它是一个让我们调用API就......
  • sql注入、事物、索引、流程控制
    目录SQL注入问题视图触发器事务存储过程函数流程控制索引相关概念索引数据结构慢查询优化测试索引联合索引全文检索插入数据更新数据删除数据主键外键重命名表事务安全管理......
  • jupyter notebook 踩坑记录
    1.安装软件路径不能是中文2.用户名不能是中文,否则找不到解释器#https://blog.csdn.net/weixin_51684729/article/details/124056544"""1.Win+R打开运行窗口,输入regedi......
  • 计算机网络详解(基础篇)1-3章(韩立刚老师)
    1.lnternet发展网络:让部分电脑实现短距通信(较小范围:如实验室)互联网:路由器连接多个网络形成互联网,实现远距通信。(任意部门或单位或个体都可接入)通讯介质可以是光纤或无......
  • Day 21
    2022.11.29开学倒计时67天上午学不下去东西做了规划,14:30-14:40补完了昨晚闭馆剩下的一条习题,按计划14:40-15:40文学院教材(外国文学,20-25天读完),15:55-16:55文学院公开课《说......
  • Socket套接字实现TCP协议客户端
    tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=input("请输入连接的服务的IP:")port=int(input("请输入服务的端口:"))tcp_socket.connect((h......