我应该使用CancellationTokenSource还是CancellationToken来取消.NET中的任务

时间:2015-12-08 19:24:22

标签: c# task-parallel-library task

我看到CancellationTokenCancellationTokenSource都有IsCancellationRequested getter方法。大多数示例都将CancellationToken传递给Task内执行的方法。它通过使用任何这些来看我,电话可以返回。如果我使用IsCancellationRequested的{​​{1}},那会有问题吗?什么时候我应该抛出异常(使用CancellationTokenSource)或者如果有取消请求则从方法返回,如下面的代码所示?

ThrowIfCancellationRequested

2 个答案:

答案 0 :(得分:4)

  1. CancellationTokenSource保存并控制CancellationToken个实例。期望任务方法使用取消令牌但不修改它。如果将CancellationTokenSource传递给方法,则该方法可以完全控制取消令牌。因此,该方法应将CancellationToken作为参数。

  2. 取消请求后方法的行为取决于您。如果任务已被取消令牌终止,则没有规则任务应处于取消状态(抛出TaskCanceledException)。

答案 1 :(得分:1)

在我看来,CancellationTokenSource用于启动取消(例如,通过另一个/父线程)。 CancellationToken.Token是您传递给TaskFactory.StartNew()as MSDN says之类的关联CancellationToken

  

CancellationTokenSource.IsCancellationRequested属性表示是否   已请求取消此令牌源,例如由于调用其Cancel方法。

然后Task将监控CancellationToken.IsCancellationRequested以确定何时关闭。

对于属性CancellationToken.IsCancellationRequested MSDN says

  

获取是否已为此令牌请求取消。

总结一下,我想说CancellationTokenSource.IsCancellationRequested用于将CancellationTokenTaskFactory.StartNew()相关联。 CancellationToken.IsCancellationRequested用于定义是否已为此令牌请求取消。此外,IntelliSenseCancellationTokenSource.Token.IsCancellationRequestedCancellationToken.IsCancellationRequested具有相同的定义。