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 应用程序。