C#TaskCancellationTokenSource IsCancellationRequested从未发现

时间:2018-07-26 16:55:37

标签: c# .net asynchronous task cancellationtokensource

有人可以帮助我了解取消任务的工作原理吗?我从docs.microsoft.com阅读了一些简单的示例,但是我的实现无法按预期工作。

下面是我尝试使用的内容:

    private Task _Task { get; set; }

    private CancellationTokenSource _TaskCancellationTokenSource { get; set; }

    private void StartTask()
    {
        _TaskCancellationTokenSource = new CancellationTokenSource();

        _Task = Task.Run(async () =>
        {
            while (true)
            {
                if(_TaskCancellationTokenSource.IsCancellationRequested)
                {
                    Console.WriteLine("Canceling");

                    _TaskCancellationTokenSource.Token.ThrowIfCancellationRequested();
                }

                Console.WriteLine("Running");

                await Task.Delay(10000, _TaskCancellationTokenSource.Token);
            }
        }, _TaskCancellationTokenSource.Token);
    }

    private void StopTask()
    {
        Console.WriteLine("Stoping task");
        _TaskCancellationTokenSource.Cancel();
        Console.WriteLine("Task stoped");
    }

我每隔10秒调用一次StartTask()。控制台会按原样写入“正在运行”。但是在调用StopTask()之后,仅出现“正在停止任务”和“任务已停止”。永远不会将“取消”写入控制台。但是VS调试器在已取消的“任务”属性中显示,并且“运行”不再出现。

2 个答案:

答案 0 :(得分:0)

我认为调用_TaskCancellationTokenSource.Cancel();在您的子线程中引发某种异常。 (可能是TaskCanceledException)

尝试将任务代码包装在try / catch附件中,并在catch子句中显示消息。

答案 1 :(得分:0)

谢谢大家。我的问题下面的Mike评论是正确的。

Task.Delay正在使用相同的取消令牌创建任务。

我从以下位置更改了

await Task.Delay(3000, _TaskCancellationTokenSource.Token);

收件人:

await Task.Delay(3000);

它完全可以按照我的要求来工作。