Подтвердить что ты не робот

Каков правильный способ отмены нескольких задач в С#

У меня есть кнопка, которая порождает 4 задачи. Эта же кнопка изменяется на кнопку отмены, и нажатие на нее должно отменять все 4 задания. Должен ли я передавать один и тот же токен для всех 4 задач и опросить ли они один и тот же токен для IsCancelRequested? Я смущен после прочтения документа msdn на createlinkedtokensource. Как это обычно делается? спасибо

Обновление: Task.WaitAll() ждет завершения выполнения всех задач. Точно так же, как узнать, когда все задачи были отменены, когда для параметра "Отключить токен маркера" установлено значение "Отменить".

4b9b3361

Ответ 1

Да, то, что вы сказали об использовании одного CancellationToken, правильно. Вы можете создать одиночный CancellationTokenSource и использовать его CancellationToken для всех задач. Ваши задачи должны регулярно проверять маркер для отмены.

Например:

const int NUM_TASKS = 4;

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;

Task[] tasks = new Task[NUM_TASKS];
for (int i = 0; i < NUM_TASKS; i++)
{
    tasks[i] = Task.Factory.StartNew(() =>
    {
        while (true)
        {
            Thread.Sleep(1000);
            if (ct.IsCancellationRequested)
                break;
        }
    }, ct);
}

Task.WaitAll(tasks);

Ваша кнопка может вызвать cts.Cancel(); для отмены задач.

Обновление для обновления вопросов:

Есть несколько способов сделать то, что вы просите. Один из способов - использовать ct.IsCancellationRequested для проверки отмены без броска, а затем разрешить выполнение вашей задачи. Затем Task.WaitAll(tasks) завершится, когда все задачи будут отменены.

Я обновил код, чтобы отразить это изменение.

Ответ 2

Да, вы должны передать один и тот же токен и использовать это, чтобы отменить все задачи за один раз, если это ваше намерение.

Ответ 3

Используйте BackroundWorker класс, задайте свойство WorkerSupportsCancellation, запустите задачи, вызвав RunWorkerAsync() и остановите их, используя CancelAsync()

Вы не можете синхронизировать свой код с пользовательским интерфейсом.