2013-08-18 4 views
1

Я создаю программу для загрузки файлов с веб-сайтов загрузки. Я создал фонового рабочего для обработки больших файлов, поскольку он обычно зависает от пользовательского интерфейса при загрузке больших файлов.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, но я считаю, что это должно быть, и я не уверен, какие аргументы я бы использовал. Я пробовал разные аргументы, которые, как я думал, будут работать, но они этого не сделали.

ответ

0

Необходимо позвонить по телефону [YourBackgroundWorkerObject].ReportProgress изнутри DoWork. Это вызывает событие ProgressChanged.
Затем ваша процедура ProgressChanged должна вызвать метод изменения пользовательского интерфейса.
(BTW, вы также можете пропустить этот Прогресс-Репортаж-перенаправление BGW. Вызовите свой собственный метод изменения UI непосредственно из DoWork.)

+0

Спасибо за ваш ответ. Я просто хотел спросить, смогу ли я использовать DownloadProgressChangedEventArgs? Я спрашиваю об этом, потому что на данный момент я использую BytesReceived (функция DownloadProgressChangedEventArgs) для вычисления скорости и размера загрузки. Есть ли другой способ, который я мог бы использовать в качестве альтернативы, если я не могу продолжать использовать это? –

+0

Я использую AddHandler wc.DownloadProgressChanged, AddressOf bw_ProgressChanged, но, как я уже говорил, он фактически ничего не делает. –

+0

Вы можете передать любые аргументы вашему собственному методу, возможно, посмотрите один пример [здесь] (http://stackoverflow.com/questions/12533412/multithreading-for-a-progressbar-and-code-locations-vb-net) (в ответе). И, как я уже сказал, ProgressChanged не вызывается автоматически, вам придется вызывать через ReportProgress в вашем методе DoEvents (который вы должны написать, если вы еще этого не сделали). – KekuSemau