Marc Intes
Marc Intes

Reputation: 737

VB.net stopping a backgroundworker

I want to create a button that could stop my background worker and end all the process it is working on.

Here is my sample backgroundworker code:

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            Try
                If BackgroundWorker1.IsBusy <> True Then
                    BackgroundWorker1.RunWorkerAsync()
                End If
            Catch ex As Exception
            End Try

        End Sub

        Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

            Dim counter As Integer = 1

            Do

            'updated code with stop function----------------
            BackgroundWorker1.WorkerSupportsCancellation = True
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True
                ProgressBar1.Value = 0
                Exit Do
            End If
            'updated code with stop function----------------

            ListBox1.Items.Add(counter)

            ProgressBar1.Value = ((counter - 1) / limit) * 100
            counter = counter + 1
            Loop While(counter <= 999999999999999999)

        End Sub

        Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
            Try
            Catch ex As Exception
            End Try
        End Sub

        Private Sub BackgroundWorker1_Completed(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            Try
            Catch ex As Exception
            End Try
        End Sub

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False    
        End Sub

        'updated code with stop function----------------
        Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
              If BackgroundWorker1.IsBusy Then

                  If BackgroundWorker1.WorkerSupportsCancellation Then                
                     BackgroundWorker1.CancelAsync()
                  End If
              End If
        End Sub
        'updated code with stop function----------------

I want to reset the loop and return the Progress Bar to 0% when i stop the backgroundworker.

Is this possible?


The code above has been updated and it is now working fine.

I have added this code inside my do loop:

        BackgroundWorker1.WorkerSupportsCancellation = True
        If BackgroundWorker1.CancellationPending Then
            e.Cancel = True
            ProgressBar1.Value = 0
            Exit Do
        End If

I created a button that stops the worker:

    Private Sub StopButton_Click(sender As Object, e As EventArgs) Handles StopButton.Click
          If BackgroundWorker1.IsBusy Then

              If BackgroundWorker1.WorkerSupportsCancellation Then                
                 BackgroundWorker1.CancelAsync()
              End If
          End If
    End Sub

Upvotes: 7

Views: 35593

Answers (2)

Thaanuja
Thaanuja

Reputation: 1

Public Class Form1
    Private iVal As Integer = 0
    Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
        For iVal = iVal To 100 Step 1
            bgw.ReportProgress(iVal)
            Threading.Thread.Sleep(99)
            If (bgw.CancellationPending = True) Then
                e.Cancel = True
                Exit For
            End If
        Next
    End Sub

    Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
        pbar.Value = e.ProgressPercentage
        lblProgrss.Text = e.ProgressPercentage.ToString() & "%"
    End Sub

    Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted

        If (e.Cancelled = True) Then
            pic.Visible = False
            pbar.Value = iVal
            lblProgrss.Text = iVal & "%"
            btnstart.Text = "Start"
            btnstart.BackColor = Color.Green
        Else
            pic.Visible = False
            btnstart.Text = "Start"
            btnstart.BackColor = Color.Green
            iVal = 0
        End If

    End Sub

    Private Sub btnstart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnstart.Click
        If (btnstart.Text = "Start") Then
            btnstart.Text = "Stop"
            btnstart.BackColor = Color.Red
            pic.Visible = True
            bgw.RunWorkerAsync()
        Else
            If (bgw.IsBusy = True) Then
                btnstart.Text = "Start"
                btnstart.BackColor = Color.Green
                bgw.CancelAsync()
            End If
        End If
    End Sub
End Class

Upvotes: -1

Heslacher
Heslacher

Reputation: 2167

The Backgroundworker class has the method CancelAsync() which you need to call to cancel the execution of the bgw.

You need to set the Backgroundworker.WorkerSupportsCancellation property to true and inside the while loop you need to check the CancellationPending property wether the value is true which indicates a call to the CancelAsync() method.

If CancellationPending evaluates to true, you would ( which you should have done already ) call one of the overloaded ReportProgress() (Docu) methods to set your ProgressBar value to the desired value.

EDIT: You should set the Cancel property of the DoWorkEventArgs to true so you can check the Cancelled property of the RunWorkerCompletedEventArgs inside the RunworkerCompletedevent.

You also shouldn not access any controls which lives in the UI thread. You better use the ProgressChanged(Docu) event.

See: BackgroundWorker Docu

Upvotes: 13

Related Questions