如何取消CancellationToken

Leo*_*rdo 38 c# task-parallel-library cancellationtokensource

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

所以我的问题是:我怎么能拥有一个CancellationToken取消它呢?

Rya*_*anS 66

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

// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
previouslyProvidedToken = source.Token;
...
source.Cancel();
Run Code Online (Sandbox Code Playgroud)

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

我怎么能只拥有一个CancellationToken取消它呢?

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

  • @Leonardo你*在只给出令牌时不能*获取源.它是**by design*当你拥有的只是那个令牌时你无法取消令牌.如果可能的话,这将是一个破碎的系统. (4认同)
  • 像在编辑中那样覆盖`previouslyProvidedToken`是一个坏习惯...如果取消提供的令牌的源(在树中的更高级别),则此功能在功能上不会对该取消做出反应。在这种情况下,传递CancellationToken完全没有用,因此Daniel Park的答案提供了更好的解决方案。 (2认同)

Dan*_*ark 8

作为迄今为止提供的,如果你想同时拥有答案的扩展CancellationToken实例提供给您的方法,在内部取消,你应该检查CancellationTokenSource.CreateLinkedTokenSource。本质上,这将在cts.Cancel()被调用时取消,或者将其提供的令牌之一取消。


and*_*ate 6

令牌使您有权知道有人正在尝试取消某些内容。它并不赋予您实际发出取消信号的权利。只有取消令牌源才能为您提供。这是设计使然。