原文:https://docs.microsoft.com/en...
本文对原文进行了提炼并翻译为中文。
Cancel不代表终止代码
不要想当然地依附Cancel机制“terminate a Task”,这是做不到的!
一个常见的误会是勾销了一个工作后,该工作就会主动进行;但其实这种了解是不正确的;试想一下,如果勾销真的能够达到terminate一个Task的成果,那它和危险的Thread.Abort有什么区别呢?因为真的依照“cancel即在Task代码外部抛出异样”去了解,那么你没有对完结后的程序状态有任何开头工作。
所以CancellationTokenSource
抑或其对应的CancellationToken
都只是发一个告诉给Task:你能够完结了;而具体怎么捕捉这个音讯并响应,是Task的用户代码本人思考的问题。
参考原文中的代码,要害的一个片段是:
if (ct.IsCancellationRequested){ Console.WriteLine("Task {0} cancelled", taskNum); ct.ThrowIfCancellationRequested();}
这相似于软件工程中的“埋点”,即在要害的代码行中插入监控代码,判断工作是否被勾销
WhenAny或Wait(token)会导致异样抛出
看回原文中的代码:
try{ await Task.WhenAll(tasks.ToArray());}catch (OperationCanceledException){ Console.WriteLine($"\n{nameof(OperationCanceledException)} thrown\n");}
一旦工作勾销,那么Task.WhenAll
会导致异样抛出;这里是非常容易误导人的一点:Task外部也产生了异样,从而打断的Task外部代码流,从而令工作强制退出了吗?
答案是:Task自身代码运行只受到本人外部代码管制,不可能单单因为CancellationTokenSource
收回了勾销信号,就终端了工作的运行。