Почему мои асинхронные запросы ввода-вывода возвращают TRUE вместо выхода с ошибкой ERROR_IO_PENDING? |
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translation complete.
Пользователь сообщил, что его программа не обрабатывала флаг FILE_FLAG_OVERLAPPED как полагается:
Моя программа открывает хендл файла в режиме FILE_FLAG_OVERLAPPED, привязывает его к функции обратного вызова завершения ввода-вывода при помощи функции BindIoCompletionCallback, и затем вызывает WriteFile для него. Я ожидал, что WriteFile вернет FALSE и GetLastError() вернет ERROR_IO_PENDING, указывая на асинхронный режим выполнения операции ввода-вывода, и что функция завершения будет вызвана, когда операция завершится. Однако, иногда вызов WriteFile возвращает TRUE, указывая на выполнение в синхронном на режиме. Что я не так делаю? Не хочу чтобы мой поток бокировался вводом-выводом, потому я и использую асинхронный ввод-вывод.
Когда вы указываете флаг FILE_FLAG_OVERLAPPED, вы обещаете, что ваша программа знает как обрабатывать асинхронный ввод-вывод, но она не требует от стека ввода-вывода вести себя также. Драйвер все равно может решить выполнить вашу операцию синхронно. Например, если операция записи может быть выполнена записью в буфер без блокировки, то драйвер просто скопирует туда данные и укажет синхронное завершение операции. Не беспокойтесь, будьте счастливы: Ваш ввод-вывод завершился быстрее, чем вы предполагали!
Все механизмы асинхронного завершения активны, даже если ввод-вывод завершился синхронно. Просто все они завершили свою работу до возврата из вызова WriteFile. Это означает, что хендл события все еще взведен, процедура завершения будет продолжать работать (когда вы настороженно ждете), и если хендл связан с портом завершения ввода-вывода, то порт получит уведомление о завершении.
Вы можете использовать SetFileCompletionNotificationModes для изменения некоторых характеристик этого поведения, управляя поведением подсистемы ввода-вывода, когда потенциально асинхронный запрос ввода-вывода завершается синхронно.
Original (English): Why does my asynchronous I/O request return TRUE instead of failing with ERROR_IO_PENDING?
Translation: © r3code .
