如何为已取消的任务添加续集

时间:2016-10-30 13:02:06

标签: c# .net multithreading

我有以下代码

try
{
    var cancellationTokenSource = new CancellationTokenSource();
    var token = cancellationTokenSource.Token;

    var task = Task.Run(() =>
    {
        while (token.IsCancellationRequested == false)
        {
            Console.Write("*");
            Thread.Sleep(1000);
        }
    }, token).ContinueWith((t) =>
    {                   
        Console.WriteLine("You have canceled the task");
    }, TaskContinuationOptions.OnlyOnCanceled);

    Console.WriteLine("Press enter to stop the task");
    Console.ReadLine();
    cancellationTokenSource.Cancel();
    task.Wait();
}
catch (AggregateException e)
{
    Console.WriteLine($"Got an exception => {e.InnerExceptions[0].Message}");
}

当我取消任务时,它总是抛出错误,并且没有执行继续任务。

但是当我从 continueWith 参数中删除TaskContinuationOptions.OnlyOnCanceled时,正在执行继续任务。

我所关注的书中包含参数TaskContinuationOptions.OnlyOnCanceled的代码。

行为是正确还是错误?

我是线程新手。请帮帮我。

1 个答案:

答案 0 :(得分:3)

您的第一个任务实际上并未被取消 - 您正在观察已经请求取消,但是您正在让第一个任务正常完成...这意味着您的“仅取消”任务被取消。如果您将代码更改为:

while (token.IsCancellationRequested == false)
{
    Console.Write("*");
    Thread.Sleep(1000);
}
token.ThrowIfCancellationRequested();

...然后它会按照您的预期行事。