2013-08-26 16 views
5

Chcę utworzyć przycisk, który może zatrzymać mojego pracownika tła i zakończyć cały proces, nad którym pracuje.VB.net zatrzymując pracę w tle

Oto mój przykładowy kod BackgroundWorker:

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

Chcę zresetować pętli i powrót na pasku postępu do 0%, kiedy zatrzymać BackgroundWorker.

Czy to możliwe?


Powyższy kod został zaktualizowany i działa poprawnie.

dodałem ten kod w moim pętli zrobić:

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

stworzyłem przycisk, który zatrzymuje pracownika:

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 

Odpowiedz

9

Klasa BackgroundWorker ma metodę CancelAsync() który trzeba zadzwonić do anuluj wykonanie bgw.

Musisz ustawić właściwość Backgroundworker.WorkerSupportsCancellation true i wewnątrz pętli while trzeba sprawdzić właściwość CancellationPending wether wartość jest true co wskazuje na wywołanie metody CancelAsync().

Jeśli CancellationPending wartość true, byś (które powinny już zrobione) zadzwonić pod jeden z przeciążonych ReportProgress() (Docu) metod, aby ustawić wartość ProgressBar do żądanej wartości.

EDIT: należy ustawić właściwość DoWorkEventArgsCancel true, dzięki czemu można sprawdzić właściwość RunWorkerCompletedEventArgsCancelled wewnątrz przypadku RunworkerCompleted.

Nie należy również uzyskiwać dostępu do elementów sterujących, które znajdują się w wątku interfejsu użytkownika. Lepiej użyj zdarzenia ProgressChanged (Docu).

Patrz: BackgroundWorker Docu

+0

dziękuję I zostały zaktualizowane mój oryginalny kod z przyciskiem przestać działać. umieściłem komentarz między nimi mówiąc "zaktualizowany kod z funkcją stop" –

-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