Рекомендации по асинхронным операциям WUA
В этом разделе описаны рекомендации по выполнению асинхронных операций агента Обновл. Windows (WUA).
- Асинхронные операции WUA не гарантируют определенную скорость завершения. Время завершения асинхронной операции WUA может значительно отличаться в зависимости от оборудования компьютера, версии операционной системы и конфигурации сети. Как и в других API Windows, имеющих сетевые зависимости, и которые не содержат параметр времени ожидания или задокументированную продолжительность ожидания, рекомендуется реализовать собственные механизмы времени ожидания, если требуется гарантированное время отклика. Например, можно создать рабочий поток, вызывающий асинхронный метод WUA, который задает событие или другой объект синхронизации при завершении асинхронной операции WUA; Затем основной поток может использовать функцию WaitForSingleObject или WaitForMultipleObjects , которая позволяет указать значение времени ожидания.
- При завершении поиска, скачивания, установки или удаления обновлений можно использовать IUpdateSearcher::EndSearch, IUpdateDowloader::EndDownload, IUpdateInstaller::EndInstall и IUpdateInstaller::EndUninstall из любого потока.
- При запуске поиска, скачивания, установки или удаления обновлений с помощью IUpdateSearcher::BeginSearch, IUpdateDownloader::BeginDownloader::BeginDownload, IUpdateInstaller::BeginInstall и IUpdateInstaller::BeginUninstall убедитесь, что при выпуске ссылок на объекты API WUA достаточно.
- Перед их уничтожением убедитесь, что все объекты обратного вызова, используемые в асинхронной операции, не перенаправляются. Подождите, пока счетчик ссылок объекта обратного вызова возвращается к начальному значению, прежде чем его уничтожить.
- Ссылка на объект задания, возвращаемый из соответствующего метода Begin , должна контролироваться объектом, который отличается от объектов обратного вызова. Используйте объект, который отличается от объектов обратного вызова, чтобы избежать циклических ссылок.
- При попытке управления ссылкой на объект задания с помощью объекта обратного вызова необходимо вызвать метод IDownloadJob::CleanUp, IInstallationJob::CleanUp::CleanUp или ISearchJob::CleanUp вне функции обратного вызова, чтобы отключить объект задания от объекта обратного вызова. Перед выпуском ссылки на объект задания, возвращаемый методом Begin , необходимо сделать это.
- Убедитесь, что асинхронные операции WUA завершены. Узел скриптов Windows может завершить скрипт, если все команды вне любой функции завершены, даже если API WUA по-прежнему имеет ссылки на объект обратного вызова.
- Используйте один из методов CleanUp или установите общую глобальную переменную после завершения функции обратного вызова.
- Никогда не вызывайте IDownloadJob::CleanUp, IInstallationJob::CleanUp или ISearchJob::CleanUp в объекте задания в функции обратного вызова.
- Чтобы обеспечить правильную последовательность очистки в скрипте, работающем в Windows Internet Обозреватель, вызовите метод CleanUp для всех объектов задания при обработке окна.onbeforeunload.
- Не используйте определяемые пользователем типы данных (UDT) для асинхронных операций WUA. Тип не поддерживается IUpdateSearcher::BeginSearch, IUpdateDownloader::BeginDownload, IUpdateInstaller::BeginInstall или IUpdateInstaller::BeginUninstall.