我已经定义了以下任务
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();
在一个有点相关的说明中,不得不传递取消令牌似乎是任务库的一个主要设计缺陷。
答案 0 :(得分:16)
您的延续任务将取消您取消的CancellationToken。这意味着继续任务虽然未启动,但正在取消。不要将该令牌传递给您不想取消的内容。
CancellationToken旨在立即取消整个行动图。您可以通过不传递令牌来排除取消内容。