ZetCode

VBScript 异步属性

最后修改于 2025 年 4 月 9 日

VBScript 中的 async 属性控制操作是否应异步执行。它通常与 XMLHTTP 请求一起使用,以实现非阻塞执行。设置为 True 时,脚本可以在等待操作完成的同时继续运行。此属性对于响应式脚本设计至关重要。

async 对于可能耗时较长的网络操作特别有用。它可以防止脚本在长时间运行的任务中冻结。本教程通过实际示例涵盖 async,以演示其在各种场景中的用法。

异步属性概述

async 属性是一个布尔值,用于确定执行模式。True 启用异步操作,而 False 强制同步行为。它在 VBScript 的 XMLHTTP 和 FileSystemObject 等对象上可用。

主要功能包括非阻塞执行和事件驱动编程。异步模式需要适当的事件处理才能完成。理解此属性有助于创建在操作过程中不会冻结的高效脚本。

基本异步 XMLHTTP 请求

此示例演示了一个简单的异步 XMLHTTP 请求。脚本在不阻塞执行的情况下从 URL 获取数据。async 属性设置为 True 以实现非阻塞行为。

basic_async.vbs
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 如何影响脚本执行流程。同步版本在完成前阻塞,而异步版本允许继续执行。

sync_vs_async.vbs
' 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 允许同时发送多个请求。此示例演示了如何管理多个并发操作。每个请求都有自己的回调以进行单独的完成处理。

multiple_async.vbs
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。每个对象都有自己的回调处理程序。两个请求并发运行。脚本在退出前等待两个请求都完成。此模式对于并行操作很有用。

异步操作中的错误处理

异步操作需要适当的错误处理。此示例演示了异步请求中的错误管理。它包括超时处理和状态码检查,以实现可靠的操作。

async_error_handling.vbs
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 不原生支持异步,但我们可以模拟异步行为。此示例显示了如何实现非阻塞文件操作。它使用包装器方法来实现类似异步的功能。

async_files.vbs
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 执行来模拟异步文件操作。主脚本在操作并行运行时继续运行。回调会通知完成。此模式可以扩展到其他文件操作。

来源

XMLHTTP 文档

在本文中,我们探讨了 VBScript 中的 async 属性,涵盖了其用法和实际应用。从基本请求到错误处理和模拟文件操作,这些示例演示了异步编程技术。通过这些知识,您可以创建更具响应性的 VBScript 应用程序。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有多年的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有八年以上的经验。

列出所有 VBScript 教程