继续取消任务

时间:2012-08-09 21:37:15

标签: c#-4.0 asynchronous task

我已经定义了以下任务

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

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

LongRunningMethod内,我检查取消令牌是否有请求取消,如果是,我从方法返回。这很好用。

但是,在这种情况下不会调用Callback。如果我用

替换上面的第二行,则会调用回调
t.ContinueWith(
    x => Callback( x, cancellationToken ),
    TaskScheduler.FromCurrentSynchronizationContext()
);

在这种情况下,任务仍然认为它已完成。

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

我通过调用

来取消任务
_cancellationTokenSource.Cancel();

在一个有点相关的说明中,不得不传递取消令牌似乎是任务库的一个主要设计缺陷。

1 个答案:

答案 0 :(得分:16)

您的延续任务将取消您取消的CancellationToken。这意味着继续任务虽然未启动,但正在取消。不要将该令牌传递给您不想取消的内容。

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