2013-08-26 6 views
5

Ich möchte einen Knopf erstellen, der meinen Hintergrundarbeiter stoppen und den ganzen Prozess beenden könnte, an dem er arbeitet.VB.net Anhalten eines Hintergrundarbeiters

Hier ist meine Probe Background 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---------------- 

Ich möchte die Schleife zurückgesetzt und der Fortschrittsbalken auf 0% zurück, wenn ich die Background stoppen.

Ist das möglich?


Der obige Code wurde aktualisiert und es funktioniert jetzt gut.

Ich habe diesen Code in meiner do-Schleife hinzugefügt:

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

ich eine Taste erstellt, die die Arbeiter halten:

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 

Antwort

9

die Backgroundworker-Klasse hat die Methode CancelAsync(), die Sie anrufen müssen Abbrechen der Ausführung des bgw.

Sie müssen die Backgroundworker.WorkerSupportsCancellation Eigenschaft auf true und innerhalb der while-Schleife setzen müssen Sie die CancellationPending Eigenschaft überprüfen, ob der Wert true ist, die einen Aufruf an die CancelAsync() Methode angibt.

Wenn CancellationPending true ergibt, würden Sie (, die Sie bereits getan haben sollte) rufen eine der überladenen ReportProgress() (Docu) Methoden, um Ihre ProgressBar Wert auf den gewünschten Wert eingestellt werden.

EDIT: Sie sollten die Cancel Eigenschaft des DoWorkEventArgs auf true gesetzt, so dass Sie die Cancelled Eigenschaft des RunWorkerCompletedEventArgs innerhalb des RunworkerCompleted Ereignis überprüfen.

Sie sollten auch nicht auf Steuerelemente zugreifen, die im UI-Thread enthalten sind. Verwenden Sie besser das Ereignis ProgressChanged (Docu).

See: BackgroundWorker Docu

+0

Thanks a lot ich meine Original-Code mit einer Arbeits Stopp-Taste aktualisiert haben. Ich habe einen Kommentar zwischen ihnen gesetzt, der "aktualisierten Code mit Stoppfunktion" sagt –

-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