简体   繁体   中英

Cancel async task?

My code isn't canceling the tasks correctly and I'm still seeing my series in my graph being drawn for the next series in the foreach loop... not sure what I'm doing wrong here as I want to exit and cancel all async tasks at this point... any ideas?

    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;
        }
    }

Try to call Cancel() on the actual CancellationTokenSource that you used to create the token that you passed to 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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM