取消异步任务?

时间:2019-08-09 12:00:33

标签: c# async-await

我的代码未正确取消任务,我仍然看到图形中的序列是为foreach循环中的下一个序列绘制的……不确定我在做什么错,因为我现在想退出并取消所有异步任务...有什么想法吗?

    private void StartTest_Click(object sender, RoutedEventArgs e)
    {
        var cancellationTokenSource = new CancellationTokenSource();
        if (_isRunning)
        {
            cancellationTokenSource.Cancel();
        }

        _isRunning = !_isRunning;
        Start(cancellationTokenSource.Token);
    }

    private async void Start(CancellationToken cancellationToken)
    {
        foreach (var buttonSelected in selectedButtons)
        {
            // If cancellation requested
            if (cancellationToken.IsCancellationRequested)
                break;

            // Retrieve series to reflect changes on
            var seriesToChange = Model.Series.Where(x => x.Title == buttonSelected.Name).ToArray();

            // Create timer
            var timerForPlotting = new DispatcherTimer();
            if (seriesToChange .Length == 1)
            {
                // Set the series to visible
                seriesToChange [0].IsVisible = true;

                timerForPlotting.Interval = TimeSpan.FromMilliseconds(50);
                timerForPlotting.Tick += (object s, EventArgs a) => PlotSeriesPoints_Tick(s, a, seriesToChange [0]);
            }

            // Start
            InitiateTimerWithButtonUIChange(timerForPlotting, buttonSelected, false);

            // Set the task to only take a couple of seconds
            await Task.Delay(2000);

            // End
            InitiateTimerWithButtonUIChange(timerForPlotting, buttonSelected, true);
        }
    }

    private void InitiateTimerWithButtonUIChange(DispatcherTimer timer, Button buttonSelected, bool isFinished)
    {
        if (!isFinished)
        {
            timer.Start();
            buttonSelected.Background = resourceDictionary["Processing"] as Brush;
        }
        else
        {
            timer.Stop();
            buttonSelected.Background = resourceDictionary["ColourActive"] as Brush;

            // Reset
            time = 0;
        }
    }

1 个答案:

答案 0 :(得分:3)

尝试在您实际用于创建传递给Cancel()的令牌的CancellationTokenSource上调用Start

CancellationTokenSource cancellationTokenSource;
private void StartTest_Click(object sender, RoutedEventArgs e)
{
    if (cancellationTokenSource != null)
    {
        cancellationTokenSource.Cancel();
        cancellationTokenSource.Dispose();
    }

    cancellationTokenSource = new CancellationTokenSource();
    _isRunning = !_isRunning;
    Start(cancellationTokenSource.Token);
}