Почему мои асинхронные запросы ввода-вывода возвращают TRUE вместо выхода с ошибкой ERROR_IO_PENDING?

Raymond Chen, “Why does my asynchronous I/O request return TRUE instead of failing with ERROR_IO_PENDING?”, public translation into Russian from English More about this translation.

Translate into another language.

Пользователь сообщил, что его программа не обрабатывала флаг FILE_FLAG_OVERLAPPED как полагается:

Моя программа открывает хендл файла в режиме FILE_FLAG_OVERLAPPED, привязывает его к функции обратного вызова завершения ввода-вывода при помощи функции Bind­Io­Completion­Callback, и затем вызывает Write­File для него. Я ожидал, что Write­File вернет FALSE и Get­Last­Error() вернет ERROR_IO_PENDING, указывая на асинхронный режим выполнения операции ввода-вывода, и что функция завершения будет вызвана, когда операция завершится. Однако, иногда вызов WriteFile возвращает TRUE, указывая на выполнение в синхронном на режиме. Что я не так делаю? Не хочу чтобы мой поток бокировался вводом-выводом, потому я и использую асинхронный ввод-вывод.

Когда вы указываете флаг FILE_FLAG_OVERLAPPED, вы обещаете, что ваша программа знает как обрабатывать асинхронный ввод-вывод, но она не требует от стека ввода-вывода вести себя также. Драйвер все равно может решить выполнить вашу операцию синхронно. Например, если операция записи может быть выполнена записью в буфер без блокировки, то драйвер просто скопирует туда данные и укажет синхронное завершение операции. Не беспокойтесь, будьте счастливы: Ваш ввод-вывод завершился быстрее, чем вы предполагали!

Все механизмы асинхронного завершения активны, даже если ввод-вывод завершился синхронно. Просто все они завершили свою работу до возврата из вызова Write­File. Это означает, что хендл события все еще взведен, процедура завершения будет продолжать работать (когда вы настороженно ждете), и если хендл связан с портом завершения ввода-вывода, то порт получит уведомление о завершении.

Вы можете использовать Set­File­Completion­Notification­Modes для изменения некоторых характеристик этого поведения, управляя поведением подсистемы ввода-вывода, когда потенциально асинхронный запрос ввода-вывода завершается синхронно.

Original (English): Why does my asynchronous I/O request return TRUE instead of failing with ERROR_IO_PENDING?

Translation: © r3code .

translated.by crowd

Like this translation? Share it or bookmark!