Es tu enfoque tu metodo q hace las actualizaciones seguramente tiene un loop
 
tu solo tienes q decile a tu BackGroundWorker q empiece cuando le des click o cualquier otro evento. 
YO lo pondria asi 
todo esto dentro del DoWork (ojo todo tu codigo debe ser invocado o estar ene ste metodo) lo q tarda mucho.  
Código:
 Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i As Integer = 0
        For i = 0 To dgv1.rows.count -2
            // Aqui pon todo tu codigo q hace el update
            BackgroundWorker1.ReportProgress(i)
        Next
    End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        label.text= "articulo: " & i & " de: " & Total
    End Sub
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Label1.Text = "Proceso completado"
    End Sub
  y los 2 eventos de worker completed y cancelado se quedna igual incluso el de progresschanged.