VB.NET DownloadDataAsync:

时间:2010-03-03 23:39:09

标签: vb.net asynchronous webclient

我遇到了最大的麻烦,我希望能在这个网站上得到一些建议。简而言之,我正在尝试从我的VB.NET应用程序进行异步Web服务调用。但是我的“client_DownloadDataCompleted”回调在下载完成后永远不会被调用。

这是我的完整代码:

Public Sub BeginAsyncDownload(ByVal Url As String)

    Dim waiter As System.Threading.AutoResetEvent = New System.Threading.AutoResetEvent(False)
    Dim client As WebClient = New WebClient()

    'client_DownloadDataCompleted method gets called when the download completes.
    AddHandler client.DownloadDataCompleted, AddressOf client_DownloadDataCompleted

    Dim uri As Uri = New Uri(Url)
    Downloading = True  'Class variable defined elsewhere
    client.DownloadDataAsync(uri, waiter)

End Sub

Private Sub client_DownloadDataCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    MessageBox.Show("Download Completed")
    Downloading = False
    Debug.Print("Downloaded")
End Sub

同样,永远不会调用client_DownloadDataCompleted方法。我也尝试过使用这个方法:

Private Sub client_DownloadDataCompleted(ByVal sender As Object, ByVal e As DownloadDataCompletedEventArgs)

没有运气。我真正需要的是在下载完成时关闭“下载”变量。

提前致谢! 布雷特

3 个答案:

答案 0 :(得分:1)

客户端(Webclient)应该在BeginAsyncDownload子例程之外声明,因此它具有表单/类级别可见性。请参考以下代码:

Public Class Form1
    Dim client as New WebClient()
    Private Sub BeginAsyncDownload(ByVal Url As String)  
       AddHandler client.DownloadDataCompleted, AddressOf client_DownloadDataCompleted                    

       Dim uri As Uri = New Uri(Url)                    
       Downloading = True  'Class variable defined elsewhere                    
       client.DownloadDataAsync(uri, waiter)   
    End Sub

Private Sub client_DownloadStringCompleted(ByVal sender As Object, ByVal e As System.Net.DownloadStringCompletedEventArgs)
   MessageBox.Show("Download Completed")                      
   Downloading = False                      
   Debug.Print("Downloaded")              
End Sub

答案 1 :(得分:0)

这是一个艰难的。我花了一点时间在这上面,并且无法弄清楚为什么没有被叫,对不起。

如果您无法使其工作,我在CodePlex上有一些代码,其中包含可能对您有帮助的WebHelper类。我试图让它像WebClient一样易于使用,但具有HttpWebRequest的所有功能。

该项目名为BizArk。我把它写成我自己的代码库。您可以随意使用您想要的位,我对代码的使用方式没有任何特别的兴趣(只要它不用于邪恶:)。

答案 2 :(得分:0)

你在什么情况下调用webclient? WebClient将获取您的SynchronizationContext.Current并将其完成回调发布到它。

如果您使用的是WinForms并且您的UI线程被阻止,它将永远无法处理您的回调。