异步下载与把比萨饼送到您家的过程相似。首先打电话到比萨饼店订购。然后,当其他人做比萨饼时,您可以做自己的事情。比萨饼做好时,送货人敲门通知晚餐已到。
对于 UserDocument,与打电话相当的是 AsyncRead 方法。而 AsyncReadComplete 事件与送货人敲门是相当的。如果以更简单的方案为例:载入文本文件到TextBox 控件,可能更容易理解一些。
要异步载入 Picture 对象到 PictureBox 控件中,请按照以下步骤执行:
Private Sub UserDocument_InitProperties() Dim strPath As String '文件路径'如果希望的话,把路径改变到另一个文本文件。'如果是在intranet上,则还可以把路径'设置到另一个计算机上,'在该计算机上,您有访问权限。strPath = "c:\Windows\Readme.txt"'现在,调用AsyncRead方法。把类型设置为' vbAsyncTypeFile(一个文件),把属性'的名称设置为Pizza。UserDocument.AsyncRead strPath, _vbAsyncTypeFile, "Pizza"End Sub
Private Sub UserDocument AsyncReadComplete _ (AsyncProp As VB.AsyncProperty) Dim FileNum as Long '用Select Case语句确定发送的是哪个属性。Select Case AsyncProp.PropertyNameCase "Pizza"'打开文件并把内容'写入TextBox中FileNum = FreeFileOpen AsyncProp.Value For Input As FileNumText1.Text = Input(LOF(FileNum), FileNum)Close FilenumEnd SelectEnd Sub
将分发比萨饼的例子再向前走一步,设想有一个比萨饼必须在 30 分钟内被分发完否则它就将是免费的规定。在这种情况下比萨饼分发人的进度就会引起人们的兴趣。可以通过向 AsyncReadProgress 事件程序中加入代码来检查“pizza”的进程:
Private Sub UserDocument AsyncReadProgress _ (AsyncProp As VB.AsyncProperty) '使用Select Case语句来读StatusCodeSelect Case AsynchProp.StatusCodeCase vbAsynchStatusCodeSendingRequestMsgBox "Attempting to connect"Case vbAsynchStatusCodeEndDownloadDataMsgBox "Download complete"Case vbAsynchStatusCodeErrorMsgBox "Error – aborting transfer"CancelAsynchRead "Pizza"End SelectEnd Sub
现在,当运行工程时,AsyncReadProgress 事件中的代码会显示两个消息框:首先,当有一个连接文件的尝试,并且传输已经结束后,如果在 Select Case 语句中设置一个断点并跟踪调试代码,就会发现 vbAsynchStatusEndDownloadData 状态代码会在 AsyncReadProgress 事件被触发前被返回。这是一个取消或重定向文件(与当“Pizza”到达时拒绝开门相类似)的最后的机会。
如果在传输期间有一个错误发生(例如,失去网络连接),vbAsyncStatusCodeError 状态代码就会被返回,这样可以允许调用 CancelAsyncRead 方法来取消传输或避免运行时的错误。
要想看由 AsyncReadProgress 事件返回的可能状态代码的列表,查看对象浏览器中的 AsyncStatusCodeConstants。
详细信息 关于 AsyncRead 方法和 AsyncReadComplete 和AsyncReadProgress 事件的详细信息,请参阅“建立 ActiveX 控件”中的“在控件中添加 Internet 功能”。虽然该主题包括了 UserControl 对象,但机制是一样的。