异步下载数据

异步下载与把比萨饼送到您家的过程相似。首先打电话到比萨饼店订购。然后,当其他人做比萨饼时,您可以做自己的事情。比萨饼做好时,送货人敲门通知晚餐已到。

对于 UserDocument,与打电话相当的是 AsyncRead 方法。而 AsyncReadComplete 事件与送货人敲门是相当的。如果以更简单的方案为例:载入文本文件到TextBox 控件,可能更容易理解一些。

要异步载入 Picture 对象到 PictureBox 控件中,请按照以下步骤执行:

  1. 按 CTRL+N 键开始一个新的工程。

  2. 单击“ActiveX 文档 DLL”,启动新的 ActiveX DLL 工程。

  3. 双击“工程资源管理器”窗口的“UserDocument1”图标,打开其设计器。

  4. 单击工具箱的 TextBox 控件图标,并在设计器上绘制 TextBox 控件。设置 MultiLine 属性为 True。

  5. 双击 UserDocument 设计器,打开其代码窗口。

  6. 添加下列代码到 InitProperties 事件中:
    Private Sub UserDocument_InitProperties()
    Dim strPath As String '文件路径
    '如果希望的话,把路径改变到另一个文本文件。
    '如果是在 intranet 上,则还可以把路径
    '设置到另一个计算机上,
    '在该计算机上,您有访问权限。
    strPath = "c:\Windows\Readme.txt"
    '现在,调用 AsyncRead 方法。把类型设置为
    ' vbAsyncTypeFile(一个文件),把属性
    '的名称设置为 PizzaUserDocument.AsyncRead strPath, _
    vbAsyncTypeFile,  "Pizza"
    End Sub
    
  7. 前面的代码是“定 Pizza”,给第三个变量(属性名参数)一个有特色的名称。

  8. 添加下面的代码到设计器中。这部分代码是“敲门”。即通知“比萨饼”已经送到,您应当处理它了:
    Private Sub UserDocument AsyncReadComplete _
    (AsyncProp As VB.AsyncProperty)
    Dim FileNum as Long
    
    ' Select Case 语句确定发送的是哪个属性。
    Select Case AsyncProp.PropertyName
    Case "Pizza"
    
    
    '打开文件并把内容
    '写入 TextBox FileNum = FreeFile
    Open AsyncProp.Value For Input As FileNum
    Text1.Text  = Input(LOF(FileNum), FileNum)
    Close Filenum
    End Select
    End Sub
    
  9. 按 F5 键运行该工程。

  10. 用Internet Explorer (或缺省浏览器)将打开并显示.vbd 文件。如果使用自己计算机上的文件,则该调用很快就发生,察觉不到任何延迟。但是,如果访问的是远程计算机上的一个大文件,则会有明显延迟。

将分发比萨饼的例子再向前走一步,设想有一个比萨饼必须在 30 分钟内被分发完否则它就将是免费的规定。在这种情况下比萨饼分发人的进度就会引起人们的兴趣。可以通过向 AsyncReadProgress 事件程序中加入代码来检查“pizza”的进程:

Private Sub UserDocument AsyncReadProgress _
(AsyncProp As VB.AsyncProperty)
   ' 使用 Select Case 语句来读 StatusCode
   Select Case AsynchProp.StatusCode
      Case vbAsynchStatusCodeSendingRequest
         MsgBox "Attempting to connect"
      Case vbAsynchStatusCodeEndDownloadData
         MsgBox "Download complete"
      Case vbAsynchStatusCodeError
         MsgBox "Error – aborting transfer"
         CancelAsynchRead "Pizza"
   End Select
End Sub

现在,当运行工程时,AsyncReadProgress 事件中的代码会显示两个消息框:首先,当有一个连接文件的尝试,并且传输已经结束后,如果在 Select Case 语句中设置一个断点并跟踪调试代码,就会发现 vbAsynchStatusEndDownloadData 状态代码会在 AsyncReadProgress 事件被触发前被返回。这是一个取消或重定向文件(与当“Pizza”到达时拒绝开门相类似)的最后的机会。

如果在传输期间有一个错误发生(例如,失去网络连接),vbAsyncStatusCodeError 状态代码就会被返回,这样可以允许调用 CancelAsyncRead 方法来取消传输或避免运行时的错误。

要想看由 AsyncReadProgress 事件返回的可能状态代码的列表,查看对象浏览器中的 AsyncStatusCodeConstants。

详细信息 关于 AsyncRead 方法和 AsyncReadComplete 和AsyncReadProgress 事件的详细信息,请参阅“建立 ActiveX 控件”中的“在控件中添加 Internet 功能”。虽然该主题包括了 UserControl 对象,但机制是一样的。