如果我在检查取消时仍有一个仍在范围内的CancellationTokenSource - 例如,如果我刚刚进行了数据库查询并且尚未将CancellationToken传递给任务来处理结果 - 应该我从源或其令牌?
访问IsCancellationRequested换句话说,如果两个选项都可用,这是首选,为什么?
1:
myCancellationTokenSource.IsCancellationRequested
2:
myCancellationTokenSource.Token.IsCancellationRequested
答案 0 :(得分:6)
在这种特殊情况下,我认为两者基本相同。我更喜欢使用Token,因为如果您稍后将创建取消源的逻辑中的逻辑检查取消分开,则会简化重构。为了进一步,我会将令牌存储在本地引用中,并使用该引用进行检查。
答案 1 :(得分:1)
通常,myCancellationTokenSource
用于启动取消(例如,通过父线程)。 myCancellationTokenSource.Token
是您要传递给CancellationToken
之类的关联TaskFactory.StartNew()
。然后,任务将监视CancellationToken.IsCancellationRequested
以确定何时关闭。
答案 2 :(得分:1)
我会使用一个令牌,但至少对于变体1,效果可能是相同的。 CancellationTokens是只读值类型,它们是在客户端代码周围传递的,而CancellationTokenSource是具有一些内部资源的IDisposable ...出于安全考虑,我宁愿像这样使用它:
void MethodA() {
// Context in which CancellationTokenSource is known
using (var tSource = new CancellationTokenSource()) {
ThreadPool.QueueWorkItem( pArg => MethodB(tSource.Token) );
ThreadPool.QueueWorkItem( pArg => MethodC(tSource.Token) );
// ...
// some other work to do
// cancel
if (mSomethingHappend) {
tSource.Cancel();
}
}
}
private static void MethodB( CancellationToken pToken )
{
// ...
}