Программируя отмены вызовов, имейте в виду нижеследующие соображения:
Нет гарантии того, что лежащий в основе драйвер правильно поддерживает отмену.
Отменяя асинхронный ввод/вывод (I/O) данных, когда нет асинхронной (перекрывающей) структуры, обеспечивающей функцию CancelIoEx, функция пытается отменить весь ожидающий выполнения ввод - вывод (I/O) в файле во
всех потоках в процессе. Каждый поток обрабатывается индивидуально, так что после того, как поток обработан, он может запустить другой ввод - вывод (I/O) в файле перед тем, как у всех других потоков их ввод - вывод (I/O) для файла
был отменен, что вызовет проблемы синхронизации.
Отменяя асинхронный ввод/вывод (I/O) данных, не используйте снова асинхронные структуры для целевой отмены. Как только операция ввода/вывода (I/O)
завершает работу (или благополучно или с отмененным статусом), тогда асинхронная (перекрывающая) структура больше не находится в использовании системой и может быть снова использована.
Отменяя синхронный ввод - вывод (I/O), вызов функции CancelSynchronousIo пытается отменить любой текущий синхронный запрос к потоку. Вы должны позаботиться о том, чтобы гарантировать, что синхронизация вызовов
корректна; неправильный вызов в серии вызовов мог быть отменен. Например, если функция CancelSynchronousIo вызвана для синхронной операции X, операция Y только начинается после того, как та операция X завершена (нормально или с
ошибкой). Если поток, который вызывал операцию X затем запускает другой синхронный вызов X, вызов отмены может прервать этот новый запрос на ввод-вывод (I/O) данных.
Отменяя синхронный ввод - вывод (I/O), надо помнить, что состязание может существовать всякий раз, когда поток совместно используется между различными частями приложения, например, с потоком пула потоков.