VBScript 异步属性
最后修改于 2025 年 4 月 9 日
VBScript 中的 async
属性控制操作是否应异步执行。它通常与 XMLHTTP 请求一起使用,以实现非阻塞执行。设置为 True 时,脚本可以在等待操作完成的同时继续运行。此属性对于响应式脚本设计至关重要。
async
对于可能耗时较长的网络操作特别有用。它可以防止脚本在长时间运行的任务中冻结。本教程通过实际示例涵盖 async
,以演示其在各种场景中的用法。
异步属性概述
async
属性是一个布尔值,用于确定执行模式。True 启用异步操作,而 False 强制同步行为。它在 VBScript 的 XMLHTTP 和 FileSystemObject 等对象上可用。
主要功能包括非阻塞执行和事件驱动编程。异步模式需要适当的事件处理才能完成。理解此属性有助于创建在操作过程中不会冻结的高效脚本。
基本异步 XMLHTTP 请求
此示例演示了一个简单的异步 XMLHTTP 请求。脚本在不阻塞执行的情况下从 URL 获取数据。async
属性设置为 True 以实现非阻塞行为。
Set xmlhttp = CreateObject("MSXML2.XMLHTTP") xmlhttp.async = True xmlhttp.onreadystatechange = GetRef("HandleResponse") xmlhttp.open "GET", "https://example.com/api/data", True xmlhttp.send Sub HandleResponse() If xmlhttp.readyState = 4 Then If xmlhttp.status = 200 Then WScript.Echo xmlhttp.responseText End If End If End Sub ' Keep script running while waiting for response While xmlhttp.readyState <> 4 WScript.Sleep 100 Wend
脚本创建 XMLHTTP 对象并将 async
设置为 True。它为状态更改注册了一个回调。请求在后台执行,而脚本继续运行。循环保持脚本处于活动状态直到完成。
同步与异步比较
此示例比较同步和异步请求行为。它显示了 async
如何影响脚本执行流程。同步版本在完成前阻塞,而异步版本允许继续执行。
' Synchronous request Set syncHttp = CreateObject("MSXML2.XMLHTTP") syncHttp.async = False syncHttp.open "GET", "https://example.com/api", False syncHttp.send WScript.Echo "Sync complete: " & syncHttp.status ' Asynchronous request Set asyncHttp = CreateObject("MSXML2.XMLHTTP") asyncHttp.async = True asyncHttp.onreadystatechange = GetRef("AsyncComplete") asyncHttp.open "GET", "https://example.com/api", True asyncHttp.send WScript.Echo "Async started (script continues)" Sub AsyncComplete() If asyncHttp.readyState = 4 Then WScript.Echo "Async complete: " & asyncHttp.status End If End Sub ' Script continues executing here WScript.Sleep 2000
同步请求在回显前阻塞直到完成。异步版本在开始后立即回显。回调处理完成通知。这演示了异步模式的非阻塞优势。
多个并发异步请求
async
允许同时发送多个请求。此示例演示了如何管理多个并发操作。每个请求都有自己的回调以进行单独的完成处理。
Set req1 = CreateObject("MSXML2.XMLHTTP") Set req2 = CreateObject("MSXML2.XMLHTTP") req1.async = True req2.async = True req1.onreadystatechange = GetRef("Req1Complete") req2.onreadystatechange = GetRef("Req2Complete") req1.open "GET", "https://example.com/api1", True req2.open "GET", "https://example.com/api2", True req1.send req2.send Sub Req1Complete() If req1.readyState = 4 Then WScript.Echo "Request 1 completed" End If End Sub Sub Req2Complete() If req2.readyState = 4 Then WScript.Echo "Request 2 completed" End If End Sub ' Wait for both requests While req1.readyState <> 4 Or req2.readyState <> 4 WScript.Sleep 100 Wend
创建了两个 XMLHTTP 对象,async 设置为 True。每个对象都有自己的回调处理程序。两个请求并发运行。脚本在退出前等待两个请求都完成。此模式对于并行操作很有用。
异步操作中的错误处理
异步操作需要适当的错误处理。此示例演示了异步请求中的错误管理。它包括超时处理和状态码检查,以实现可靠的操作。
Set xmlhttp = CreateObject("MSXML2.XMLHTTP") xmlhttp.async = True startTime = Timer timeout = 5 ' seconds xmlhttp.onreadystatechange = GetRef("HandleResponse") xmlhttp.open "GET", "https://example.com/unreliable", True xmlhttp.send Sub HandleResponse() If xmlhttp.readyState = 4 Then If xmlhttp.status = 200 Then WScript.Echo "Success: " & xmlhttp.responseText Else WScript.Echo "Error: " & xmlhttp.status & " - " & xmlhttp.statusText End If End If End Sub ' Timeout handling While xmlhttp.readyState <> 4 If Timer - startTime > timeout Then xmlhttp.abort WScript.Echo "Request timed out" Exit While End If WScript.Sleep 100 Wend
脚本为异步请求实现了一个超时机制。回调会检查 readyState 和 status。如果操作耗时太长,它会被中止。这可以防止对失败的请求进行无限等待。
使用 FileSystemObject 进行异步文件操作
虽然 FileSystemObject 不原生支持异步,但我们可以模拟异步行为。此示例显示了如何实现非阻塞文件操作。它使用包装器方法来实现类似异步的功能。
Set fso = CreateObject("Scripting.FileSystemObject") Set shell = CreateObject("WScript.Shell") ' Simulate async file copy Sub AsyncCopyFile(source, dest, callback) shell.Run "cmd /c copy """ & source & """ """ & dest & """", 0, False callback() End Sub Sub OnCopyComplete() WScript.Echo "File copy completed (simulated async)" End Sub ' Usage AsyncCopyFile "C:\temp\source.txt", "C:\temp\dest.txt", GetRef("OnCopyComplete") ' Script continues while copy runs in background WScript.Echo "Script continues execution..." WScript.Sleep 2000
脚本使用 shell 执行来模拟异步文件操作。主脚本在操作并行运行时继续运行。回调会通知完成。此模式可以扩展到其他文件操作。
来源
在本文中,我们探讨了 VBScript 中的 async
属性,涵盖了其用法和实际应用。从基本请求到错误处理和模拟文件操作,这些示例演示了异步编程技术。通过这些知识,您可以创建更具响应性的 VBScript 应用程序。