我看到CancellationToken
和CancellationTokenSource
都有IsCancellationRequested
getter方法。大多数示例都将CancellationToken
传递给Task
内执行的方法。它通过使用任何这些来看我,电话可以返回。如果我使用IsCancellationRequested
的{{1}},那会有问题吗?什么时候我应该抛出异常(使用CancellationTokenSource
)或者如果有取消请求则从方法返回,如下面的代码所示?
ThrowIfCancellationRequested
答案 0 :(得分:4)
CancellationTokenSource
保存并控制CancellationToken
个实例。期望任务方法使用取消令牌但不修改它。如果将CancellationTokenSource
传递给方法,则该方法可以完全控制取消令牌。因此,该方法应将CancellationToken
作为参数。
取消请求后方法的行为取决于您。如果任务已被取消令牌终止,则没有规则任务应处于取消状态(抛出TaskCanceledException
)。
答案 1 :(得分:1)
在我看来,CancellationTokenSource
用于启动取消(例如,通过另一个/父线程)。 CancellationToken.Token
是您传递给TaskFactory.StartNew()as MSDN says之类的关联CancellationToken
:
CancellationTokenSource.IsCancellationRequested
属性表示是否 已请求取消此令牌源,例如由于调用其Cancel方法。
然后Task
将监控CancellationToken.IsCancellationRequested
以确定何时关闭。
对于属性CancellationToken.IsCancellationRequested
MSDN says:
获取是否已为此令牌请求取消。
总结一下,我想说CancellationTokenSource.IsCancellationRequested
用于将CancellationToken
与TaskFactory.StartNew()
相关联。 CancellationToken.IsCancellationRequested
用于定义是否已为此令牌请求取消。此外,IntelliSense
对CancellationTokenSource.Token.IsCancellationRequested
和CancellationToken.IsCancellationRequested
具有相同的定义。