You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VB6中异步使用Chilkat获取网站数据避免程序卡顿?

解决Chilkat异步HTTP请求导致程序卡顿的问题

问题根源

你当前代码卡顿的核心原因是用Do While循环+task.SleepMs阻塞了UI线程,这完全违背了异步请求的设计初衷——异步本应让UI线程在等待期间保持响应,而不是被循环卡死。另外,TaskCompleted事件未生效是因为对象声明存在错误,重复定义了Http变量,导致带事件的对象实例未被正确使用。

解决方案

1. 修正对象声明

删除重复的Dim Http As New ChilkatHttp,只保留带WithEvents的声明,确保事件能被正确触发:

Dim WithEvents Http As ChilkatHttp

2. 初始化带事件的Http对象

在程序初始化时(比如Form_Load事件中)创建Http实例:

Private Sub Form_Load()
    Set Http = New ChilkatHttp
    ' 可在此设置Http的其他属性,比如超时、代理等
End Sub

3. 发起异步请求(无需循环等待)

直接调用QuickGetObjAsync并启动任务,不用手动循环检查任务状态,交给TaskCompleted事件处理结果:

Private Sub cmdGetText_Click()
    Dim task As ChilkatTask
    Set task = Http.QuickGetObjAsync("http://www.example.com/notification.txt")
    
    If (Http.LastMethodSuccess <> 1) Then
        Debug.Print Http.LastErrorText
        Exit Sub
    End If
    
    ' 启动异步任务,无需等待,直接返回,UI保持响应
    Dim success As Long
    success = task.Run()
    If (success <> 1) Then
        Debug.Print task.LastErrorText
        Exit Sub
    End If
End Sub

4. 正确实现TaskCompleted事件

确保事件过程中的Http对象和你发起请求的实例是同一个,并且处理逻辑正确:

Private Sub Http_TaskCompleted(ByVal task As Chilkat_v9_5_0.IChilkatTask)
    Dim response As New ChilkatHttpResponse
    Dim success As Long
    
    success = response.LoadTaskResult(task)
    If (success <> 1) Then
        Debug.Print response.LastErrorText
        MsgBox "加载响应失败:" & response.LastErrorText
        Exit Sub
    End If
    
    ' 在此处理响应内容,比如显示到文本框或MsgBox
    MsgBox response.Body
    Debug.Print "状态码: " & response.StatusCode
    Debug.Print "响应头: " & response.Header
End Sub

关键注意事项

  • 不要在UI线程中使用任何阻塞式等待(比如Do While循环+SleepMs),这会直接导致程序卡顿。
  • 确保WithEvents声明的对象实例是唯一的,避免重复定义变量覆盖实例。
  • 若需要清理线程池,可在程序退出时调用glob.FinalizeThreadPool(),不要在请求完成后立即调用,避免影响后续异步任务。

内容的提问来源于stack exchange,提问作者Unforgiven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:02:26