【问题标题】:VB.NET DownloadDataAsync:VB.NET 下载数据异步:
【发布时间】:2010-03-03 23:39:08
【问题描述】:

我在解决一个错误时遇到了最大的麻烦,我希望我能在这个网站上得到一些建议。简而言之,我正在尝试从我的 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)

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

提前致谢! 布雷特

【问题讨论】:

    标签: vb.net asynchronous webclient


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      这是一个艰难的过程。我花了一点时间在这上面,但无法弄清楚为什么它没有被调用,抱歉。

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

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

      【讨论】:

        【解决方案3】:

        您在什么情况下调用网络客户端? WebClient 将获取您的 SynchronizationContext.Current 并将其完成回调发布给它。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-18
          相关资源
          最近更新 更多