Я создаю программу для загрузки файлов с веб-сайтов загрузки. Я создал фонового рабочего для обработки больших файлов, поскольку он обычно зависает от пользовательского интерфейса при загрузке больших файлов.Vb Background Worker
Мне удалось заставить его работать, но проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу использовать мой AddHandler, чтобы показать измененный прогресс, поэтому я попытался использовать метод invoke для изменений, которые были изменены.
Это код, который я пытался для метода Invoke:
Dim ProgressChanged As New ProgressChange(AddressOf bw_ProgressChanged)
Me.Invoke(ProgressChanged, Nothing, EventArgs.Empty)
Это мой обработчик ProgressChanged.
Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
Dim percentage As Double = bytesIn/totalBytes * 100
ProgressBarCurrent.Value = Int32.Parse(Math.Truncate(percentage).ToString())
Dim BytesDownloaded As String = (e.BytesReceived/(DirectCast(e.UserState, Stopwatch).ElapsedMilliseconds/1000.0#)).ToString("#")
If BytesDownloaded < 1024 Then
Dim Bs As String = Convert.ToInt32(BytesDownloaded)
Label4.Text = (Bs & " B/s")
ElseIf BytesDownloaded < 1048576 Then
Dim KBs As String = Math.Round(BytesDownloaded/1024, 2)
Label4.Text = (KBs & " KB/s")
ElseIf BytesDownloaded < 1073741824 Then
Dim MBs As String = Math.Round(BytesDownloaded/1048576, 2)
Label4.Text = (MBs & " MB/s")
ElseIf BytesDownloaded < 1099511627776 Then
Dim GBs As String = Math.Round(BytesDownloaded/1073741824, 2)
Label4.Text = (GBs & " GB/s")
Else
Label4.Text = ("Estimating...")
End If
End Sub
У этого есть еще несколько кодов, но я не думаю, что это необходимо показать.
И это мой делегат.
Delegate Sub ProgressChange(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
Я также пробовал несколько разных вещей с помощью метода addhandler.
AddHandler wc.DownloadProgressChanged, AddressOf bw_ProgressChanged
Раньше, когда я использовал этот код я получаю ошибку, но теперь, когда я использую его, нет никакой ошибки, но код не делает ничего, как это даже не уволил, поэтому я решил добавить обработчик не будет работать.
Я не был уверен, можно ли использовать метод Invoke для DownloadProgressChanged, но я считаю, что это должно быть, и я не уверен, какие аргументы я бы использовал. Я пробовал разные аргументы, которые, как я думал, будут работать, но они этого не сделали.
Спасибо за ваш ответ. Я просто хотел спросить, смогу ли я использовать DownloadProgressChangedEventArgs? Я спрашиваю об этом, потому что на данный момент я использую BytesReceived (функция DownloadProgressChangedEventArgs) для вычисления скорости и размера загрузки. Есть ли другой способ, который я мог бы использовать в качестве альтернативы, если я не могу продолжать использовать это? –
Я использую AddHandler wc.DownloadProgressChanged, AddressOf bw_ProgressChanged, но, как я уже говорил, он фактически ничего не делает. –
Вы можете передать любые аргументы вашему собственному методу, возможно, посмотрите один пример [здесь] (http://stackoverflow.com/questions/12533412/multithreading-for-a-progressbar-and-code-locations-vb-net) (в ответе). И, как я уже сказал, ProgressChanged не вызывается автоматически, вам придется вызывать через ReportProgress в вашем методе DoEvents (который вы должны написать, если вы еще этого не сделали). – KekuSemau