异步 WUA 操作指南
本主题确定执行异步 Windows 更新代理 (WUA) 操作时要遵循的准则。
- 异步 WUA 操作不能保证任何特定的完成速度。 异步 WUA 操作的完成时间可能因计算机硬件、操作系统版本和网络配置而异。 与其他具有网络依赖关系且不包含超时参数或记录超时持续时间的 Windows API 一样,如果需要有保证的响应时间,我们建议你考虑实施自己的超时机制。 例如,可以创建一个工作线程来调用异步 WUA 方法,并在异步 WUA 操作完成时设置事件或其他同步对象;然后,主线程可以使用 WaitForSingleObject 或 WaitForMultipleObjects 函数,从而使你可以指定超时值。
- 结束更新的搜索、下载、安装或卸载时,可以使用来自任何线程的 IUpdateSearcher::EndSearch、IUpdateDowloader::EndDownload、IUpdateInstaller::EndInstall 和 IUpdateInstaller::EndUninstall。
- 当使用 IUpdateSearcher::BeginSearch、IUpdateDownloader::BeginDownload、IUpdateInstaller::BeginInstall 和 IUpdateInstaller::BeginUninstall 开始搜索、下载、安装或卸载更新时,确保在释放对 WUA API 对象的引用时保持足够的访问权限。
- 在销毁异步操作之前,请确保未引用在异步操作中使用的任何回调对象。 在销毁回调对象之前,请等待回调对象的引用计数返回到初始值。
- 对从相应 Begin 方法返回的作业对象的引用应由与回调对象不同的对象控制。 使用与回调对象不同的对象以避免循环引用。
- 如果尝试使用回调对象控制对作业对象的引用,则必须在回调函数之外调用 IDownloadJob::CleanUp、IInstallationJob::CleanUp 或 ISearchJob::CleanUp 方法,以断开作业对象与回调对象的连接。 在释放对 Begin 方法返回的作业对象的引用之前,必须执行此操作。
- 确保异步 WUA 操作已完成。 Windows 脚本主机可以在任何函数之外的所有命令完成时终止脚本,即使 WUA API 仍具有对回调对象的引用也是如此。
- 使用 CleanUp 方法之一或在完成时让回调函数设置共享全局变量。
- 从不在其回调函数中调用 IDownloadJob::CleanUp、IInstallationJob::CleanUp 或 ISearchJob::CleanUp。
- 若要确保在 Windows Internet Explorer 上运行的脚本中正确的清理顺序,在处理 window.onbeforeunload 时对所有作业对象调用 CleanUp 方法。
- 不要将用户定义的数据类型 (UDT) 用于异步 WUA 操作。 IUpdateSearcher::BeginSearch、IUpdateDownloader::BeginDownload、IUpdateInstaller::BeginInstall 或 IUpdateInstaller::BeginUninstall 不支持该类型。