Отчет о прогрессе WebClient.DownloadData - PullRequest
0 голосов
/ 24 марта 2020

У меня есть BackgroundWorker для загрузки файла изображения и просмотра его в PictureBox. Я хочу сообщить о ходе этой загрузки (поскольку это может быть большой файл изображения) и обновить ProgressBar. Кажется, я не могу найти правильный способ сделать это.

Я нашел эту статью в документации Microsoft, но она содержит только C# использование. Кто-нибудь может указать мне правильное направление?

Мой настоящий код внутри BackgroundWorker:

Private Sub BackgroundWorker3_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker3.DoWork
    Dim Test1 As String = "DOWNLOAD URL"
    Dim tClient As WebClient = New WebClient
    Dim tImage As Bitmap = Bitmap.FromStream(New MemoryStream(tClient.DownloadData(Test1)))
    PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    PictureBox1.Image = tImage
End Sub

Я думаю, это будет что-то вроде ReportProgress от BackgroundWorker, но не может понять, как применить его к данным загрузки, так как я не знаю фактический размер файла:

ReportProgress(Convert.ToInt32((contagem / count) * 100))

1 Ответ

0 голосов
/ 24 марта 2020

Как отмечают разработчики в комментариях, эффективный способ загрузки данных в асинхронном режиме c может быть следующим: есть два события: одно для прогресса, а другое - в конце загрузки. Я собрал некоторый код в качестве основы, которую вы можете начать улучшать. Надеюсь, что это была ваша цель :)

Event OnDownloadCompleted(downloadedDataAsByteArray() As Byte)
Event OnDownloadProgress(percentage As Integer)

Private Sub DownLoadFileAsync(address As String)

    Dim client As Net.WebClient = New Net.WebClient()

    AddHandler client.DownloadDataCompleted, Sub(sender As Object, e As System.Net.DownloadDataCompletedEventArgs)
                                                 RaiseEvent OnDownloadCompleted(e.Result)
                                             End Sub

    AddHandler client.DownloadProgressChanged, Sub(sender As Object, e As System.Net.DownloadProgressChangedEventArgs)
                                                   RaiseEvent OnDownloadProgress(e.ProgressPercentage)
                                                   Application.DoEvents()
                                               End Sub

    Dim uri As Uri = New Uri(address)
    client.DownloadDataAsync(uri)

End Sub

Использование

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    AddHandler Me.OnDownloadProgress, Sub(percet As Integer)
                                          Console.WriteLine("Percent reiceved: " & percet.ToString)
                                      End Sub


    AddHandler Me.OnDownloadCompleted, Sub(data() As Byte)
                                           Console.WriteLine("Download completed, total: " & data.Count)
                                           Using mStream As New MemoryStream(data)
                                               'Do what you want with this image
                                               Dim image As Image = Image.FromStream(mStream)
                                           End Using
                                       End Sub


    DownLoadFileAsync("https://images.pexels.com/photos/3952233/pexels-photo-3952233.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260")

End Sub
...