11

我已经定义了以下任务

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();

在一些相关的说明中,必须传递取消令牌似乎是任务库的主要设计缺陷。

4

1 回答 1

21

您的继续任务需要一个您取消的 CancellationToken。这意味着未启动的延续任务正在被取消。不要将该令牌传递给您不想取消的事物。

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

于 2012-08-09T21:38:48.730 回答