Выбор ответа Middle async/await и Task спрашивают часто обновлено
Отмена через CancellationToken
Вопрос
Как правильно реализовать отмену долгой асинхронной операции?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Принять CancellationToken и передавать его во все вложенные вызовы. Отмена в .NET кооперативная: операция сама проверяет токен и прокидывает его дальше, например в HttpClient и EF Core.
Варианты ответа
- Принять
CancellationTokenи передавать его во все вложенные вызовыправильный ответ - Вызвать
Thread.Abort()у потока, на котором выполняется задача - Хранить флаг
bool cancelledи проверять его без синхронизации - Вызвать
task.Dispose()у выполняющейся задачи, чтобы прервать её
Разбор
Отмена в .NET кооперативная: операция сама проверяет токен и прокидывает его дальше, например в HttpClient и EF Core. При отмене бросается OperationCanceledException. Thread.Abort в .NET Core и новее не поддерживается. Простой флаг без volatile может не увидеть изменения из другого потока и не прерывает ожидающий ввод-вывод. Dispose у задачи её не останавливает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.