Vb.net Vb后台工作程序

Vb.net Vb后台工作程序,vb.net,backgroundworker,Vb.net,Backgroundworker,我正在创建一个从下载网站下载文件的程序。我创建了一个后台工作程序来处理下载大文件,因为它在下载大文件时通常会冻结UI 我已经设法让它工作,但我现在面临的问题是,我无法使用AddHandler来显示更改的进度,因此我尝试使用invoke方法来显示更改的进度值 这是我为invoke方法尝试的代码: Dim ProgressChanged As New ProgressChange(AddressOf bw_ProgressChanged) Me.Invoke(ProgressChanged, Not

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

我已经设法让它工作,但我现在面临的问题是,我无法使用AddHandler来显示更改的进度,因此我尝试使用invoke方法来显示更改的进度值

这是我为invoke方法尝试的代码:

Dim ProgressChanged As New ProgressChange(AddressOf bw_ProgressChanged)
Me.Invoke(ProgressChanged, Nothing, EventArgs.Empty)
这是我的处理程序

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
我还尝试了一些不同的addhandler方法

AddHandler wc.DownloadProgressChanged, AddressOf bw_ProgressChanged
以前当我使用这段代码时,我遇到了一个错误,但是现在当我使用它时,没有错误,但是代码实际上没有做任何事情,就像它甚至没有被激发一样,所以我认为添加处理程序是不起作用的


我不确定是否可以对DownloadProgressChanged使用Invoke方法,但我相信应该可以,而且我不确定我会使用什么参数。我曾尝试过不同的论点,我认为这些论点是可行的,但都没有

您需要从内部调用
[YourBackgroundWorkRobject]。
DoWork。这将触发ProgressChanged事件。
然后,您的ProgressChanged过程必须调用进行UI更改的方法。

(顺便说一句,您也可以跳过BGW的进度报告重新路由。直接从
DoWork
调用您自己的UI更改方法)

谢谢您的回复。我只是想问我是否还能使用DownloadProgressChangedEventArgs?我这样问是因为目前我正在使用BytesReceived(DownloadProgressChangedEventArgs函数)来计算下载速度和大小。如果我不能继续使用,还有其他方法可以替代吗?我使用的是AddHandler wc.DownloadProgressChanged,AddressOf bw_ProgressChanged,但正如我之前所说,它实际上没有任何作用。你可以将任何参数传递给你自己的方法,也许可以看到一个示例(在答案中)。正如我所说,ProgressChanged不是自动调用的,您必须在
DoEvents
-方法中通过ReportProgress调用(如果您还没有编写,则必须编写)。不,
DoWork
,而不是
DoEvents
(无法再编辑它了…)并且:请确保您注意(在链接的示例代码中)关于
AddHandler bgw.DoWork
RunWorkerAsnyc
的部分。如果你的代码中没有,你需要从那里开始,我已经记下了。如果你想看的话,这是我当前的代码。这是有点混乱,因为我一直在尝试不同的东西负荷。
AddHandler wc.DownloadProgressChanged, AddressOf bw_ProgressChanged