Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 继续执行已取消的任务_C# 4.0_Asynchronous_Task - Fatal编程技术网

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参数是独立的。