我定义了以下任务
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();从某种程度上讲,必须传递取消令牌似乎是任务库的一个主要设计缺陷。
发布于 2012-08-09 21:38:48
您的继续任务接受您取消的CancellationToken。这意味着继续任务在未启动时将被取消。不要把那个记号传给你不想取消的东西。
CancellationToken的意思是立即取消整个动作图。您可以通过不传递令牌来从取消中排除内容。
https://stackoverflow.com/questions/11892315
复制相似问题