Сигнал должен кто-то обработать
CancellationTokenSource позволяет запросить отмену, а CancellationToken передаётся выполняющейся операции. Эта модель кооперативная: получатель должен заметить запрос и предусмотренным способом на него отреагировать. Передача токена в метод, который его игнорирует, не останавливает работу автоматически. В собственной длительной обработке нужны разумно расположенные проверки; при вызове поддерживающей отмену операции токен передают дальше. Метод ThrowIfCancellationRequested позволяет выразить реакцию исключением отмены. Это отдельный исход, который не следует без разбора смешивать с ошибкой обработки данных.
Перестать ждать и прекратить работу
Отмена ожидания означает, что вызывающий код больше не ждёт результат. Исходная задача при этом может продолжать выполняться. Поэтому ей всё ещё могут понадобиться открытый поток, буфер или другой ресурс. Если закрыть их только потому, что интерфейс перестал ждать, можно создать дополнительную ошибку. Нужно определить владельца операции и способ наблюдать её окончательный исход. Иначе позднее исключение останется незамеченным, а пользователь получит сообщение об отмене, хотя работа фактически завершится.
Отмена не путешествует назад во времени
В условном экспорте есть три этапа: подготовка данных, запись во временный файл и подтверждение готового результата. Если отмена пришла во время подготовки, можно прекратить дальнейшие шаги. Если результат уже подтверждён, сигнал не уничтожает автоматически созданный документ. Граница подтверждения должна быть частью проекта. Для временных данных заранее определяют порядок очистки и поведение при ошибке. Это прикладные решения: один CancellationToken не превращает набор файловых или сетевых действий в транзакцию с автоматическим откатом.
Проверяйте исход, а не только флаг
Между проверкой токена и завершением этапа может прийти новый запрос отмены. Кроме того, операция иногда успевает закончиться прежде, чем обработает сигнал. Поэтому сам факт запроса не доказывает состояние отменено. В журнале полезно раздельно фиксировать запрос, завершение этапов и итог: успех, отмена или ошибка. Не следует перехватывать любое исключение и подписывать его отменой. Если ошибка произошла независимо, её причина нужна для диагностики. Упорядоченные записи помогают восстановить последовательность без догадок о состоянии задачи.
Попробуйте на практике
Спроектируйте на бумаге поведение экспорта при отмене, не создавая и не удаляя настоящие файлы.
- Нарисуйте этапы: подготовка, временная запись, подтверждение результата. Обозначьте момент, после которого документ считается готовым.
- Для каждого этапа укажите, получает ли он токен и где может заметить запрос.
- Рассмотрите три сценария: отмена до начала, во время подготовки и после подтверждения.
- Отдельно добавьте ситуацию, когда интерфейс прекратил ожидание, но операция ещё пишет данные.
- Для каждого сценария запишите итоговое сообщение и кто отвечает за освобождение ресурсов и наблюдение поздней ошибки.
Как проверить результат. В плане нет обещания автоматического отката от токена. Отмена ожидания отделена от окончания операции, подтверждённый результат не объявлен исчезнувшим, а каждый ресурс имеет понятного владельца.
Частые вопросы
Нужно ли создавать новый поток ради отмены?
Нет. Токен описывает механизм уведомления, а не способ запуска. Его используют и в асинхронных, и в длительных синхронных операциях.
Можно ли показывать успех после запроса отмены?
Да, если операция уже завершилась успешно или не приняла запрос. Интерфейс должен отражать установленный итог, а не выводить его только из нажатия кнопки.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.