CancelIo()
работает отлично.Я неправильно понял мой код.
При дальнейшем исследовании выясняется, что код вызывал CancelIo()
, за которым следует ReadFile()
с таймаутом INFINITE
.Порт завершения никогда не получал уведомление о прочтении, потому что удаленный конец никогда ничего не отправлял.Другими словами, CancelIo()
не отменял последующие операции.
Я нашел некоторую открывающую документацию здесь :
Будьте осторожны при кодировании для асинхронного I/ O потому что система оставляет за собой право сделать операцию синхронной, если ей нужно .Поэтому лучше всего написать программу для правильной обработки операции ввода-вывода, которая может быть выполнена либо синхронно, либо асинхронно.Пример кода демонстрирует это соображение.
Оказывается, что драйверы устройств могут выбрать обработку асинхронной операции синхронно, если считываемые данные уже кэшируются драйвером устройства.После дальнейшего расследования я обнаружил, что когда CancelIo()
вызывался до ReadFile()
, иногда это приводило к тому, что последний возвращался синхронно.Я понятия не имею, почему порт завершения никогда не получал уведомление о ReadFile()
после CancelIo()
, но я больше не могу воспроизвести эту проблему.
Порт завершения сигнализируется независимо от того, является ли ReadFile()
синхронным илиасинхронный.