为了下载一些图像,我正在使用线程睡眠延迟对一个循环中的WebClient实例进行DownloadDataAsync调用。我希望响应发生在不同的线程上,但似乎没有,因为响应仅在所有调用完成后发生。
那么有什么适当的修复方法呢?是否有替代客户端类型,或者我应该为每个webclient调用创建一个线程?
所以目前我正在循环调用它:
Private Sub StartDownload(ByVal webImageLink As String, ByVal token As Object)
Dim wc As New WebClient
Try
AddHandler wc.DownloadDataCompleted, AddressOf OnDownloadCompleted
wc.DownloadDataAsync(New System.Uri(webImageLink), token)
Threading.Thread.Sleep(delay)
Catch ex As Exception
Debug.Print("Exception in ImageDownloader.DoDownload ")
End Try
End Sub
答案 0 :(得分:1)
功能,而不是错误。如果可以,WebClient会努力在同一个线程上引发DownloadCompleted事件。当您从Winforms或WPF应用程序的UI线程调用它时,它可以。这通常是可取的,您可以在完成事件处理程序中更新UI,而无需使用Control / Dispatcher.BeginInvoke()。但是副作用是在代码停止运行之前不会发生这种情况,因此可以调用事件处理程序。它由UI线程的调度循环调度。
如果你确实需要一个解决方法,那就是使用一个以ThreadPool.QueueUserWorkItem()或Thread开头的小帮助方法开始下载。