72

我开始一个任务,然后开始其他任务等等。鉴于该树,如果任何任务失败,则整个操作的结果将毫无用处。我正在考虑使用取消令牌。令我惊讶的是,令牌没有“CancelThisToken()”方法......

我怎样才能拥有一个CancellationToken来取消它?

4

4 回答 4

102

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

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

CancellationToken 结构

我怎样才能拥有一个 CancellationToken 取消它?

编辑:我在几年前写了这篇文章并重新审视它,我不知道它在写作时或现在是否真的有效。将其原样留在这里以供后代使用。

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

于 2015-06-16T18:28:10.480 回答
18

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

于 2015-06-16T20:47:22.633 回答
7

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

于 2019-09-21T21:08:41.097 回答
1

CancellationToken从实例生成CancellationTokenSource实例并调用CTSCancel实例。

示例:取消()

还有一种方法可以优雅地取消线程而不触发异常。只需检查 CTIsCancellationRequested并自行处理此案。

更多信息:使用 IsCancellationRequested 属性?

于 2015-06-16T18:27:12.773 回答