C#: отмена задания не работает (CancellationTokenSource) - PullRequest
0 голосов
/ 30 марта 2020

У меня есть какой-то долго работающий код, который я хотел бы запустить как Task и отменить при необходимости, используя CancellationTokenSource, но отмена не работает, так как моя задача продолжает выполняться, когда вызывается tokenSource.Cancel() (без исключения брошено).

Возможно, упускаете что-то очевидное?

Сокращенный пример ниже:

bool init = false;

private void Button1_Click(object sender, EventArgs e)
{
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    CancellationToken token = tokenSource.Token;
    Task task = new Task(() =>
    {
        while (true)
        {
            token.ThrowIfCancellationRequested();

            if (token.IsCancellationRequested)
            {
                Console.WriteLine("Operation is going to be cancelled");
                throw new Exception("Task cancelled");
            }
            else
            {
                // do some work
            }
        }
    }, token);

    if (init)
    {
        tokenSource.Cancel();
        button1.Text = "Start again";
        init = false;
    } else
    {
        try
        {
            task.Start();
        } catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        button1.Text = "Cancel";
        init = true;
    }
}

1 Ответ

3 голосов
/ 30 марта 2020

Основная проблема в вашем коде заключается в том, что вы не сохраняете tokenSource. Второй вызов Button1_Click отменяет токен, отличный от того, который вы передаете задаче во время первого вызова.

Вторая проблема заключается в том, что вы снова и снова создаете новую задачу, но ваши логики c предполагают, что вы хотите одну задачу, которая должна создается при первом щелчке и прекращается при втором щелчке.

...