C# 如何取消CancellationToken

C# 如何取消CancellationToken,c#,task-parallel-library,cancellationtokensource,C#,Task Parallel Library,Cancellationtokensource,我开始一项任务,开始其他任务等等。根据该树,如果任何任务失败,整个操作的结果都是无用的。我正在考虑使用取消代币。令我惊讶的是,令牌没有“CancelThisToken()”方法 只有一个我怎么能取消它呢?从CancellationTokenSource实例中生成CancellationToken实例,并在CTS实例上调用cancel 例如: 还有一种方法可以优雅地取消线程,而不会触发异常。只需检查CT是否已请求取消安装,并自行处理即可 更多信息:作为文档状态,您需要从源对象调用cancel方法。

我开始一项任务,开始其他任务等等。根据该树,如果任何任务失败,整个操作的结果都是无用的。我正在考虑使用取消代币。令我惊讶的是,令牌没有“CancelThisToken()”方法


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

CancellationTokenSource
实例中生成
CancellationToken
实例,并在CTS实例上调用
cancel

例如:

还有一种方法可以优雅地取消线程,而不会触发异常。只需检查CT是否已请求取消安装,并自行处理即可


更多信息:

作为文档状态,您需要从源对象调用cancel方法。示例代码包含在您提供的链接中。以下是相关章节:

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

只有一个取消令牌,我如何才能取消它

Edit:我几年前写过这篇文章,现在又重温了一遍,我不知道这篇文章在写的时候或现在是否真的有效。把它留给子孙后代


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

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

令牌使您有权知道有人正在尝试取消某些内容。它并没有给你发出取消信号的权利。只有取消令牌源提供给您。这是出于设计。

您正在寻找CancellationTokenSource@CoderDennis我不知道如何才能获得仅给定令牌的令牌源…如果您没有
CancellationTokenSource
则无法取消它。令牌是所有线程共享的对象,此对象由
CancellationTokenSource.Cancel()
方法设置。一旦这样做,
CancellationToken.IsCancellationRequested
将为true。在那之前,它永远是假的。(不能直接设置。)如果您没有
CancellationTokenSource
,则没有任何东西能够引发取消。您需要一个
CancellationTokenSource
来取消这样的线程。@Leonardo,您应该首先创建tokensource,然后从中请求令牌。请看我提供的链接中的示例代码这是我在工作时用于备份实用程序的方法-如果任何
任务
失败,我的结果也将无效。(两个数据库,一个是SQL,一个是AS/400 DB2,不同步,这是不可接受的。因此,如果出现任何问题,我将丢弃所有数据。)@Leonardo如果只提供令牌,则无法获取源代码。根据设计,当您只有一个令牌时,您不能取消该令牌。如果可以的话,这将是一个坏系统。@RyanS我的意思是你应该在答案中添加Servy的信息(或我的)。像在编辑中那样重写以前提供的令牌是一种不好的做法。。。如果所提供的令牌的源被取消(在树的更高级别上),则从功能上讲,它不会对该取消做出反应。在这种情况下,传递CancellationToken是完全没有用的,因此Daniel Park的答案提供了一个更好的解决方案。然后,当您被提供一个时,您就可以控制取消。您可以跟踪IsCancellationRequested,也可以依靠框架在线程上抛出异常来强制执行此操作?我想答案是“你不能”