2012-08-09 116 views
6

我已经定义了以下任务ContinueWith已取消的任务

var t = Task.Factory.StartNew(
    () => LongRunningMethod(cancellationToken), 
    cancellationToken 
); 

t.ContinueWith(
    Callback, 
    cancellationToken, 
    TaskContinuationOptions.None, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

LongRunningMethod里面,我检查取消标记已请求取消,如果是这样,我从方法返回。这很好。

但是,在这种情况下不会调用回调。回调确实被调用,如果我取代以上

t.ContinueWith(
    x => Callback(x, cancellationToken), 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

在这种情况下,任务仍然认为它运行完成第二行。

为什么第一个电话不工作?我的印象是TaskContinuationOptions.None意味着无论线程的状态如何,回调都会被调用。

我取消任务致电:

_cancellationTokenSource.Cancel(); 

在一个有点相关的说明,不必绕过取消标记好像任务库的主要设计缺陷。

回答

12

您的继续任务需要取消CancellationToken。这意味着继续任务在未启动时被取消。不要将该标记传递给您不想取消的事物。

CancellationToken旨在一次取消整个动作图。您可以通过不传递令牌来排除取消内容。

+0

然后TaskContinuationOptions.None做什么?如果我说TaskContinuationOptions.OnlyOnCancelled,那也不起作用。 – user981225 2012-08-09 21:42:31

+1

如果* parent *任务被取消,TaskContinuationOptions提供了一种不执行的方法。 CancellationToken参数是独立的。 – usr 2012-08-09 21:54:28