BackgroundWorkers - 静态进度的 ProgressChanged

BackgroundWorkers - ProgressChanged for static progress

我想在不让我的 UI 无法运行的情况下,使用后台程序非常频繁地轮询硬件传感器。 因为 backgroundworker 只是轮询直到被中断——运行时完全由用户中断它来决定——可以说它没有任何进展。

如果我用常量值调用 ReportProgress,例如ReportProgress(1),这还会调用ProgressChanged吗?我要求 ProgressChanged 根据最新的投票数据更新 UI。

作为第一个参数传递给 ReportProgress 的值仅用于 UI 线程上的代码,以显示后台任务的进度。
它对于执行对 ProgressChanged 的​​调用并不重要。

如果您需要将一些不同的数据传递给您的 ProgressChanged 事件,您可以使用 ReportProgress 的重载,它接受两个参数并允许将自定义对象的实例作为第二个参数传递。

在这个非常简单的示例中,我定义了一个名为 WorkingStatus 的 class,其中只有一个 属性,我在 DoWork 方法中更改了它,然后我传递了这个 class 的一个实例到 ProgressChanged 事件。当然,您的 WorkingStatus class 可能会更复杂,因为您想要在 UI 线程

上显示所有信息
public class WorkingStatus

    public Current as Integer
    '.... other properties as needed....
End Class

Sub Main
    Dim bkw = new BackgroundWorker()
    bkw.WorkerReportsProgress = true
    AddHandler bkw.ProgressChanged, AddressOf bgw_ProgressChanged
    AddHandler bkw.DoWork, AddressOf bgw_DoWork
    bkw.RunWorkerAsync()

    ' This loop just to avoid the immediate close of the example
    Dim counter = 0
    While (bkw.IsBusy)
        counter+=1
        Console.WriteLine("IsBusy " & counter.ToString())
        Thread.Sleep(150)
    End While     
End Sub




private sub bgw_DoWork(sender as object, e as DoWorkEventArgs)
    Dim bgw = DirectCast(sender, BackgroundWorker)
    Dim sts = new WorkingStatus() With {.Current = 0}

    '  A simulation of your inner working 
    for i = 0 to 10
        Thread.Sleep(5000)
        sts.Current+=1
        bgw.ReportProgress(1, sts)
    Next
    Console.WriteLine("Background DoWork ENDED")
End Sub

private sub bgw_ProgressChanged(sender as object, e as ProgressChangedEventArgs)

    Dim sts = DirectCast(e.UserState, WorkingStatus)
    Console.WriteLine("Progress:" & e.ProgressPercentage.ToString() & ", Status=" & sts.Current)
End Sub