我遇到了最大的麻烦,我希望能在这个网站上得到一些建议。简而言之,我正在尝试从我的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)
没有运气。我真正需要的是在下载完成时关闭“下载”变量。
提前致谢! 布雷特
答案 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线程被阻止,它将永远无法处理您的回调。