Vb背景工作者

时间:2013-08-18 15:19:01

标签: vb.net backgroundworker

我正在创建一个从下载网站下载文件的程序。我已经创建了一个后台工作程序来处理下载大文件,因为它通常会在下载大文件时冻结UI。

我设法让它工作但我现在面临的问题是我无法使用我的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

在我使用这段代码之前我遇到了一个错误,但现在当我使用它时,没有错误,但代码实际上没有做任何事情,比如它甚至没有被解雇,所以我想添加处理程序将无法正常工作。

我不确定是否可以对DownloadProgressChanged使用Invoke方法,但我相信它应该是,我不知道我会使用什么参数。我尝试了不同的论点,我认为这些论点可行,但他们并没有。

1 个答案:

答案 0 :(得分:0)

您需要从[YourBackgroundWorkerObject].内拨打DoWork ReportProgress。这会触发ProgressChanged事件 然后,您的ProgressChanged过程必须调用UI更改的方法 (顺便说一句,你也可以跳过BGW的Progress-Reporting-Reroute。直接从DoWork调用你自己的UI改变方法。)