VB.net stopping a backgroundworker

backgroundworker, vb.net

Solution

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 `RunworkerCompleted`event.

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

See: BackgroundWorker Docu

Problem

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 ```

Original source