Как получить многопоточный ответ от WebClient DownloadDataAsync (или альтернативный вариант)? - PullRequest
0 голосов
/ 27 марта 2012

Для загрузки ряда изображений я выполняю вызовы 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

1 Ответ

1 голос
/ 27 марта 2012

Функция, а не ошибка.WebClient делает все возможное, чтобы вызвать событие DownloadCompleted в том же потоке, если это возможно.Это возможно при вызове из потока пользовательского интерфейса приложения Winforms или WPF.Что обычно желательно, вы можете обновить пользовательский интерфейс в обработчике события завершения, не используя Control / Dispatcher.BeginInvoke ().Но с побочным эффектом этого не произойдет, пока ваш код не перестанет работать, поэтому можно вызвать обработчик событий.Он отправляется циклом отправки потока пользовательского интерфейса.

Обходной путь, если он вам действительно нужен, - начать загрузку с помощью небольшого вспомогательного метода, который вы начинаете с ThreadPool.QueueUserWorkItem () или Thread.

...