Да, то, что вы сказали об использовании одного 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)
завершится, когда все задачи будут отменены.
Я обновил код, чтобы отразить это изменение.