C# 4.0 继续执行已取消的任务
我定义了以下任务C# 4.0 继续执行已取消的任务,c#-4.0,asynchronous,task,C# 4.0,Asynchronous,Task,我定义了以下任务 var t = Task.Factory.StartNew( () => LongRunningMethod( cancellationToken ), cancellationToken ); t.ContinueWith( Callback, cancellationToken, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronization
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();
从某种程度上讲,必须传递取消令牌似乎是任务库的一个主要设计缺陷。您的继续任务使用一个您取消的CancellationToken。这意味着未开始的继续任务将被取消。不要把令牌传递给你不想取消的东西
CancellationToken旨在一次取消整个动作图。您可以通过不传递令牌从取消中排除内容。那么TaskContinuationOptions.None做什么?如果我说TaskContinuationOptions.OnlyOnCancelled,那也不行。TaskContinuationOptions提供了一种在父任务被取消时不执行的方法。CancellationToken参数是独立的。