2015-02-17 3 views
3

Рассмотрите this Task.Run example. Он показывает, как создать задачу с поддержкой отмены.Задать вопрос. Запрашиваемая сумма.

Я делаю что-то подобное:

Task.Run(()=>{while (!token.IsCancellationRequested()) {...}}, token); 

Мои вопросы:

  1. Поскольку у меня уже есть ссылка на маркер отмены, почему цель передать его в качестве параметра в Task.Run вызов?

  2. Я часто вижу следующий код в примерах:

    if (token.IsCancellationRequested) token.ThrowIfCancellationRequested();

Какова цель этого кода? Почему не только return от метода?

+0

Я был только ответом, но ответ Шрирам покрыл его. Но вам не нужно использовать 'if (token.IsCancellationRequested) ...' поскольку 'ThrowIfCancellationRequested' уже проверяет это. – Dirk

+0

@ Dirk Я просто накрыл это тоже :) –

ответ

7
  1. Если передать маркер отмены в Task.Run, если маркер будет отменен до запуска задачи, она никогда не будет запущен экономит ресурсы (я имею в виду не создавать темы и т.д.).

  2. Если вы только что вернулись из метода, состояние задачи не будет Canceled, это будет RanToCompletion. Ясно, что это не то, что вы ожидаете.

В качестве альтернативы вы можете бросить OperationCanceledException с CancellationToken в качестве параметра, который сделает Task.Status быть Canceled, но это трудно и многословным способом. token.ThrowIfCancellationRequested является кратким.

Вы можете просто использовать token.ThrowIfCancellationRequested();, нет необходимости проверять на наличие token.IsCancellationRequested. ThrowIfCancellationRequested способ уже делает.

+0

Хороший ответ, только один вопрос: ThrowIfCancellationRequested выдает ошибку, если это произойдет. Не испорчена ли практика использования исключений для обработки рабочего процесса? –

+3

@ MatthiasMüller Хороший вопрос. Но отмена не является нормальным потоком управления? Это означает, что вы не заинтересованы в запущенной задаче. Дизайнеры BCL решили использовать исключения для этой цели, чтобы передать отмену. Точно так же, как вы идете в гостиницу, заказали что-то, что заняло много времени, чтобы служить, вы больше не можете ждать и сказали: «Мне больше не нужно это дерьмо. Отмените это! * Поскольку это не обычная вещь, они решили использовать исключения, это моя догадка. В противном случае вам нужны флаги. Если есть вложенные вызовы методов, вы не можете справиться с этим легко. Вы видите, что я имею в виду? –

Смежные вопросы