2017-07-07 13 views
0

(这是this one的后续问题。)如何访问通过WebClient.DownloadDataAsync获取的数据?

我想读取无尽的音频流异步,以便我可以对获得的数据进行JIT分析。使用WebClient对象的DownloadDataAsync方法,我可以很容易地开始下载,请参阅以下赢形式的项目:

Imports System.Net  'For WebClient 

Public Class Form1 
    Private WithEvents c As New WebClient() 

    Protected Overrides Sub Finalize() 
     c.Dispose() 
     MyBase.Finalize() 
    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim u As New Uri("http://flower.serverhostingcenter.com:8433/;") 
     c.DownloadDataAsync(u) 
    End Sub 

    Private Sub c_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs) Handles c.DownloadProgressChanged 
     Debug.Print(e.BytesReceived.ToString & " B received.") 
    End Sub 
End Class 

和流似乎流动,为每DownloadProgressChanged事件的输出到即时窗口:

2920 B received. 
48180 B received. 
56940 B received. 
61320 B received. 
87600 B received. 
94900 B received. 
160436 B received. 
162060 B received. 
227596 B received. 
... 

但是,我缺少找到一种方法,也是读取获得的数据。由于这是一个层出不穷的流,DownloadDataCompleted将永远不会开火(除了使用的其他事件外,也不会开火)。

如何访问获取的数据?

回答

2

使用OpenReadAsync结合OpenReadCompleted事件。

Private Sub c_OpenReadCompleted(sender As Object, e As OpenReadCompletedEventArgs) Handles c.OpenReadCompleted 
    Dim stream = e.Result 
End Sub 
+0

好吧,所以'OpenReadCompleted'会触发。我不确定接下来要做什么。所有处理过程中,读取字节的字节肯定不是明智的,因为这个事件应该在自己的线程中运行,因此当操纵更大范围的变量时可能遇到问题,不是吗? - 但是,使用Read而不是ReadByte并存储整个类的数据,然后离开事件似乎不起作用:事件不会再次触发以提供下一个流部分。 - 我想我根本不理解这个概念。 – Herb

+0

WebClient连接到远程服务器后,此事件会为您提供流。它由你来读取。通常人们会将块读入缓冲区,处理该块并继续下一个块。但我不知道你想要怎么处理这些数据。 – Magnus

+0

@ Herb:Streams支持异步读/写。 –