2016-02-22 2 views
-1

Асинхронный вызов ReadDirectoryChangesW() может быть отменен функцией CancelIo(). Однако, к тому времени, когда был вызван CancelIo(), буфер уведомлений, связанный с ReadDirectoryChangesW(), может быть заполнен наполовину. Вопрос в том, что происходит с этими уведомлениями? Должны ли они обрабатываться обычным способом?Отмена асинхронной команды ReadDirectoryChangesW

Более конкретно, я выпустил наложенную команду ReadDirectoryChangesW() с процедурой завершения и отменял ее с помощью CancelIo(). Когда моя процедура завершения вызывается с ошибкой ERROR_OPERATION_ABORTED, должен ли я по-прежнему проверять буфер уведомлений на наличие возможных уведомлений?

Уточнение: Компонент «Слушатель файловой системы» успешно служит для моей компании уже более десяти лет. Теперь я собираюсь изменить компонент, чтобы реализовать более сложную политику мониторинга. В соответствии с этой политикой отмена конкретного запроса ReadDirectoryChangesW() не означает отмены мониторинга, и я не хочу пропускать даже одно уведомление.

+2

Действительно ли это имеет значение? Вы отменили мониторинг, а это значит, что вы больше этого не интересуетесь. Я бы просто полностью проигнорировал буфер и продолжил. –

+0

@RemyLebeau, я отменил конкретный запрос, но не мониторинг, и я заинтересован в каждом уведомлении. Пожалуйста, уточните, что я добавил к вопросу. – Ilia

+0

Опять же, почему это имеет значение? Если вы отмените * операцию * ввода/вывода *, вы сообщаете системе, что вам больше не нужна эта операция, поэтому вам не нужно беспокоиться о каких-либо буферизованных данных, которые могли быть сгенерированы, частично или иначе, до отмены. Почему вы заботитесь о частичных данных за то, что вы отменяете? Можете ли вы привести пример фактического использования? –

ответ

0

ОК, я нашел экспериментально, что второй параметр процедуры завершения (dwNumberOfBytesTransfered) в случае функции ReadDirecoryChangesW() содержит количество байтов, записанных в буфер уведомлений. К сожалению, я не нашел ясного подтверждения этого в документации.

Однако эта гипотеза представляется разумной, и если она всегда верна, я могу заключить о наличии уведомлений путем проверки этого параметра независимо от первого параметра процедуры завершения (dwErrorCode). Это решает проблему.