user3896248
user3896248

Reputation: 679

BackgroundWorkers - ProgressChanged for static progress

I want to use a backgroundworker to poll a hardware sensor very frequently without leaving my UI inoperable. Because the backgroundworker simply polls until interrupted - runtime is purely dictated by the user interrupting it - it has no change in progress so to speak.

If I call ReportProgress with a constant value, e.g. ReportProgress(1), will this still call ProgressChanged? I require ProgressChanged to update the UI in accordance with the latest poll data.

Upvotes: 0

Views: 2443

Answers (1)

Steve
Steve

Reputation: 216358

The value passed as first parameter to ReportProgress just serves at your code on the UI thread to display the advancement of your background task.
It has no importance for the execution of the call to ProgressChanged.

If you need to communicate some different data to your ProgressChanged event you could use the overload of ReportProgress that takes two arguments and allows to pass the instance of a custom object as second parameter.

In this very trivial example, I have defined a class named WorkingStatus with just one property that I change in the DoWork method, then I pass an instance of this class to the ProgressChanged event. Of course your WorkingStatus class could be more complex with all the informations that you want to display on the UI thread

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

Upvotes: 2

Related Questions