关于.net:NET-CancellationTokenSource-取消任务用法详解

65次阅读

共计 866 个字符,预计需要花费 3 分钟才能阅读完成。

原文: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 收回了勾销信号,就终端了工作的运行。

正文完
 0