当两者都可用时,我应该使用来自令牌或源的IsCancellationRequested吗?

时间:2011-05-06 14:01:25

标签: c# .net-4.0 task-parallel-library

如果我在检查取消时仍有一个仍在范围内的CancellationTokenSource - 例如,如果我刚刚进行了数据库查询并且尚未将CancellationToken传递给任务来处理结果 - 应该我从源或其令牌?

访问IsCancellationRequested

换句话说,如果两个选项都可用,这是首选,为什么?

1:

myCancellationTokenSource.IsCancellationRequested

2:

myCancellationTokenSource.Token.IsCancellationRequested

3 个答案:

答案 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 )
{
 // ...
}