一:ContinueWith
1.Task=>Task.CreationOptions 第一task
2.Task=>TaskContinuationOptions 第二个task
第二个task需要判断第一个task在什么情况下,我该执行或者不该执行。。
二:LazyCancellation
1.Cancellation判断任务的取消。。。相当于Thread about
1 | CancellationTokenSource source = new CancellationTokenSource();//判断任务延续 |
正常执行顺序:task1->ContinueWith task2->ContinueWith task3
结果执行顺序: task3->task1
解释:ContinueWith的时候,预先判断了source.Token的值,结果发现任务已经取消,这个时候,task2和task1没有延续的关系,所以task3和task1可以并行,看似ContinueWith的关系得不到延续【并行】
使用TaskContinuationOptions.LazyCancellation
1 | CancellationTokenSource source = new CancellationTokenSource();//判断任务延续 |
TaskContinuationOptions.LazyCancellation当task2被取消了,还是先执行等待线程执行完成,在执行后面的线程
三:ExecuteSynchronously
同步执行任务,2个线程用同一个线程执行,可以减少时间片切换
1 | Task task1 = new Task(() => { |
上图使用TaskContinuationOptions.ExecuteSynchronously,task1和task2使用同一个线程执行任务。
不使用TaskContinuationOptions.ExecuteSynchronously的结果:
四:NotOnRanToCompletion和OnlyOnRanToCompletion
前者表示延续任务必须在非完成状态才能执行
后者表示延续任务必须在完成状态才能执行
五:NotOnFaulted和OnlyOnFaulted
前者表示延续任务必须在非失败状态才能执行
后者表示延续任务必须在失败状态才能执行
六:NotOnCanceled和OnlyOnCanceled
前者表示延续任务必须在非取消状态才能执行
后者表示延续任务必须在取消状态才能执行