如何取消 CancellationToken

How to cancel a CancellationToken

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

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

CancellationTokenSource 实例生成 CancellationToken 个实例,并在 CTS 实例上调用 Cancel

示例:Cancel()

还有一种方法可以在不引发异常的情况下优雅地取消线程。查一下CT有没有IsCancellationRequested,自己处理。

更多信息:Use of IsCancellationRequested property?

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

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

CancellationToken Struct

how can I, in possession of only a CancellationToken, cancel it?

编辑: 我几年前写了这篇文章并重新访问它我不知道它是否真的有效,无论是在写的时候还是现在。留在这里留给子孙后代。

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

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

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