При использовании асинхронного ввода-вывода (или «перекрытия» ввода-вывода в Win32-жаргоне) нам необходимо иметь дело с структурой OVERLAPPED
и его членом hEvent
. Если функция ввода-вывода задерживает операцию чтения или записи, мы получим код ошибки ERROR_IO_PENDING
, затем мы ожидаем, что асинхронная операция будет завершена с помощью функции WaitForXxxEvent
, после чего мы позвоним GetOverlappedResult
.hEvent член в OVERLAPPED Структура Win32
Однако, если операция ввода-вывода будет немедленно завершена, мы не получим ERROR_IO_PENDING
, и в операции чтения наш буфер чтения будет заполнен немедленно. Но как насчет члена OVERLAPPED::hEvent
? Будет ли установлено состояние сигнализации? Я не нашел четкого заявления об этом.
Этот вопрос может показаться бессмысленным (зачем иметь дело с событием, если я знаю, что операция уже завершена?), Однако у меня есть библиотека, которая имитирует перекрывающийся шаблон, и мне нужно иметь то же точное поведение.
Как указан на edgar.holleis в his comment, Raymond Chen объяснил это в своем блоге: http://blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx
Если асинхронный ввод/вывод завершается синхронно, является hEvent в OVERLAPPED структуры сигналом в любом случае?
Да.
Когда ввод/вывод завершается (синхронно или асинхронно), событие сигнализируется и уведомления о статусе завершения ставятся в очередь. Функция
GetOverlappedResult/Ex
может использоваться для ожидания ввода-вывода, который уже завершен; он просто вернется немедленно. Если вы спросите HasOverlappedIoC завершен, завершен ли ввод-вывод, а ввод/вывод завершен синхронно, он будет правильно сообщать: «Да, конечно, он завершен . Черт возьми, он закончил давным-давно!»Другими словами, вы можете логически обрабатывать случай асинхронного запроса ввода-вывода , выполняющегося синхронно, как если бы он выполнял асинхронное завершение . Он просто завершает асинхронно, прежде чем вы даже моргнете .
Событие также будет сигнализироваться, если операция завершится немедленно. Он был протестирован с именованными каналами в Windows 7. – bkausbk