如何取消CancellationToken

时间:2015-06-16 18:23:05

标签: c# task-parallel-library cancellationtokensource

我开始执行任务,启动其他任务等等 给定该树,如果任何任务失败,则整个操作的结果是无用的。我正在考虑使用取消令牌。令我惊讶的是,令牌没有“CancelThisToken()”方法......

所以我的问题是:我如何拥有一个CancellationToken,取消它?

4 个答案:

答案 0 :(得分:49)

正如文档所述,您需要从源对象调用cancel方法。示例代码包含在您提供的链接中。以下是相关部分:

// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
previouslyProvidedToken = source.Token;
...
source.Cancel();

https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken(v=vs.110).aspx

  

我如何只拥有一个CancellationToken,取消它?

如果没有对来源的引用,则无法取消令牌。这并不意味着您需要首先生成令牌的CancellationTokenSource。给定令牌时,您可以创建令牌源的新实例,将其令牌分配给提供的令牌并取消它。可以阅读此令牌的所有其他方将看到已取消请求。

答案 1 :(得分:6)

作为目前为止提供的答案的扩展,如果您希望为方法提供CancellationToken实例,在内部取消,则应检查CancellationTokenSource.CreateLinkedTokenSource 。 本质上,这将在调用cts.Cancel()或其提供的令牌之一时取消。

答案 2 :(得分:0)

来自CancellationTokenSource实例的Spawn CancellationToken实例,并在CTS实例上调用Cancel。

示例:https://msdn.microsoft.com/en-us/library/dd321955(v=vs.110).aspx

还有一种方法可以优雅地取消线程而不会触发异常,只需检查CT是否有IsCancellationRequested并自行处理。 更多信息:Use of IsCancellationRequested property?

答案 3 :(得分:0)

一个令牌,它使您有权知道某人正在尝试取消某项操作。它不赋予您实际发出取消信号的权利。只有取消令牌来源才能为您提供。这是设计使然。