Search code examples
vb.netbackgroundworkerlate-binding

Late Binding Issue with BackgroundWorker in VB.Net


I am running a BackgroundWorker, and want to report its progress. In the example below I create a test list which the BackgroundWorker then iterates through. The problem lies in the line 'sender.ReportProgress(i)'. If I have Option Strict on, it does not like my use of 'i' due to Late Binding issues. Is there any alternative way to code this and avoid that issue?

    Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' Configuring for Background Workers
        Control.CheckForIllegalCrossThreadCalls = False

        Dim MyList As New List(Of String)
        For a As Integer = 0 To 100
            MyList.Add(CStr(a))
        Next
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim bgw As New System.ComponentModel.BackgroundWorker
        bgw.WorkerReportsProgress = True
        bgw.WorkerSupportsCancellation = True
        AddHandler bgw.DoWork, AddressOf bgw_DoWork
        ' I create a BackgroundWorker here rather than add one in the toolbox so that I can specify the Handler and use different Handler routines for different part of a large program.

        Button1.Enabled = False
        Dim progress As New Progress(bgw)
        progress.ShowDialog()
        Button1.Enabled = True
    End Sub

    Private Sub bgw_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs)
        For i = 0 To MyList.Count -1
            Label1.Text = MyList(i)
            sender.ReportProgress(i)
            System.Threading.Thread.Sleep(200)
            Label1.Refresh()
        Next

    End Sub

End Class


Public Class Progress
    Private WithEvents _BGW As System.ComponentModel.BackgroundWorker

    Public Sub New(ByVal BGW As System.ComponentModel.BackgroundWorker)
        _BGW = BGW
        InitializeComponent()
    End Sub

    Private Sub frmProgress_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        If Not IsNothing(_BGW) Then
            _BGW.RunWorkerAsync()
        End If
    End Sub

    Private Sub _BGW_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles _BGW.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        Label1.Text = e.ProgressPercentage
    End Sub

    Private Sub _BGW_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles _BGW.RunWorkerCompleted
        Me.Close()
    End Sub
End Class

Solution

  • CType(sender, BackgroundWorker).ReportProgress(i)