一、概述
一个线程可以有多个任务,一个任务也可以包含多个任务。把一个任务附加给另一个任务,就需要用到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 已在一个 由于任务以同步方式执行,因此无需调用诸如 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 属性不是 此选项对多任务延续无效。 |
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