一个任务被取消。

3
我正在运行一个任务。当关闭窗口时,我试图使用取消令牌源取消该任务。错误并非每次关闭窗口时都会发生,只有有时会出现。请查看我得到的错误。

enter image description here

    private CancellationTokenSource dotIndicatorTokenSource;
    private void BlinkDotIndicator()
    {

        var halfPeriod = 200;

        dotIndicatorTokenSource = new CancellationTokenSource();
        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                Dispatcher.Invoke(() =>
                {
                    connectionIndicatorDotImg.Visibility = Visibility.Hidden;
                });
                Thread.Sleep(halfPeriod);

                Dispatcher.Invoke(() =>
                {
                    connectionIndicatorDotImg.Visibility = Visibility.Visible;
                });

                Thread.Sleep(halfPeriod);

                if (dotIndicatorTokenSource.IsCancellationRequested)
                {
                    break;
                }

            }
        }, dotIndicatorTokenSource.Token);

    }


    private void Window_Closing(object sender, CancelEventArgs e)
    {
        if (dotIndicatorTokenSource != null)
            dotIndicatorTokenSource.Cancel();
    }
1个回答

3
运行代码时,请在操作之前、之后和之间检查是否有取消请求。这样,如果在操作期间被取消,就不会执行下一个调度程序函数。
        while (true)
        {
            if (dotIndicatorTokenSource.IsCancellationRequested)
            {
                break;
            }

            Dispatcher.Invoke(() =>
            {
                connectionIndicatorDotImg.Visibility = Visibility.Hidden;
            });
            Thread.Sleep(halfPeriod);

            if (dotIndicatorTokenSource.IsCancellationRequested)
            {
                break;
            }

            Dispatcher.Invoke(() =>
            {
                connectionIndicatorDotImg.Visibility = Visibility.Visible;
            });

            Thread.Sleep(halfPeriod);

            if (dotIndicatorTokenSource.IsCancellationRequested)
            {
                break;
            }

        }

哦,我明白了。按照这个逻辑,最后还需要检查取消吗? - M. Levin
嗯,不是吧?其实并不是。但这是在睡眠后。所以并不重要。为什么不保险点呢?只需要4行代码。而且你甚至不会进入下一个循环。 - Austin Winstanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接