继续取消任务

use*_*225 9 asynchronous task c#-4.0

我已经定义了以下任务

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

t.ContinueWith(
    Callback,
    cancellationToken,
    TaskContinuationOptions.None,
    TaskScheduler.FromCurrentSynchronizationContext()
);
Run Code Online (Sandbox Code Playgroud)

在里面LongRunningMethod,我检查取消令牌是否有请求取消,如果是,我从方法返回.那很好用.

但是,在此方案中不会调用Callback.回调被调用,如果我替换上面的第二行

t.ContinueWith(
    x => Callback( x, cancellationToken ),
    TaskScheduler.FromCurrentSynchronizationContext()
);
Run Code Online (Sandbox Code Playgroud)

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

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

我通过调用取消任务:

_cancellationTokenSource.Cancel();
Run Code Online (Sandbox Code Playgroud)

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

usr*_*usr 17

您的继续任务采用您取消的CancellationToken.这意味着继续任务虽然未启动,但正在取消.不要将该标记传递给您不想取消的标记.

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