Отмена задачи

У меня есть задача, которую мне нужно отменить, если время ожидания закончено. Например,

var t = Task.Factory.StartNew(() => 
{
  Thread.Sleep(5000) // some long running task
  "do something"
});
Task.WaitAll(new[] {t}, 1000);

Но, похоже, задача все еще продолжает работать. Я попытался использовать CancellationTokenSource, но это, похоже, не работает.

Я подтвердил это, используя следующий фрагмент

static void Main(string[] args)
        {
            var cancellationTokenSource = new CancellationTokenSource();

            var t = Task.Factory.StartNew(() => {
                Thread.Sleep(5000);
                Console.WriteLine("Still working");
            }, cancellationTokenSource.Token);

            Task.WaitAll(new[] {t}, 1000);

            cancellationTokenSource.Cancel();

            Console.ReadLine();
        }

Консольные дисплеи "Все еще работают". Я думал, что задача будет отменена.

Я уверен, что чего-то не хватает. Что мне не хватает? Спасибо.

Ответ 1

Знаки отмены не магически ничего не отменят. Они просто позволяют вам проверять отмену стандартным образом, например. через ThrowIfCancellationRequested.

Как правило, у вас будет какая-то задача, которая должна выполнять большую работу. Он периодически вызывает ThrowIfCancellationRequested, а затем любой код, который должен отменить задачу, вызовет Cancel в CancellationTokenSource, когда ему нужно, Задача будет бросаться, когда она будет проверять отмену, и все будет хорошо.

Похоже, вы ищете отказ от сотрудничества, и это было бы опасно, по тем же причинам, что обычный Thread.Abort опасен. Это чище, чтобы задача могла выбрать точки, в которых она позволит себе отменить.