Выбор ответа Middle async/await и Task спрашивают часто обновлено

Отмена через CancellationToken

Вопрос

Как правильно реализовать отмену долгой асинхронной операции?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Принять CancellationToken и передавать его во все вложенные вызовы. Отмена в .NET кооперативная: операция сама проверяет токен и прокидывает его дальше, например в HttpClient и EF Core.

Варианты ответа

  1. Принять CancellationToken и передавать его во все вложенные вызовыправильный ответ
  2. Вызвать Thread.Abort() у потока, на котором выполняется задача
  3. Хранить флаг bool cancelled и проверять его без синхронизации
  4. Вызвать task.Dispose() у выполняющейся задачи, чтобы прервать её

Разбор

Отмена в .NET кооперативная: операция сама проверяет токен и прокидывает его дальше, например в HttpClient и EF Core. При отмене бросается OperationCanceledException. Thread.Abort в .NET Core и новее не поддерживается. Простой флаг без volatile может не увидеть изменения из другого потока и не прерывает ожидающий ввод-вывод. Dispose у задачи её не останавливает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме