2013-08-26 15 views
5

Arka plan çalışanımı durdurabilen ve üzerinde çalıştığı tüm işlemleri sonlandıran bir düğme oluşturmak istiyorum. Ben döngü sıfırlamak ve ben backgroundworker durdurmak zaman% 0'a Progress Bar dönmek isteyenVB.net Bir arka plan çalışmasını durdurma

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

:

İşte benim örnek backgroundworker kodudur.

Bu mümkün mü?


Yukarıdaki kod güncellendi ve şimdi iyi çalışıyor.

benim do döngü içinde bu kod ekledik:

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

Ben işçi durduran bir düğme oluşturduk:

backgroundworker sınıfı için aramak gerekir yöntemi CancelAsync() sahiptir
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 

cevap

9

bgw'nin yürütülmesini iptal et.

Sen true Backgroundworker.WorkerSupportsCancellation özelliğini ayarlamanız gerekir ve döngü içindeyken size değer CancelAsync() yöntemi çağrısı gösterir true olduğu Hava CancellationPending özelliğini kontrol etmek gerekir.

CancellationPending true olarak değerlendirilirse, siz (zaten yapmalıydım ) istenilen değere sizin ProgressBar değerini ayarlamak için aşırı ReportProgress() (Docu) yöntemlerinden birini çağırır.

DÜZENLEME: Eğer RunworkerCompleted olayın içine RunWorkerCompletedEventArgs ait Cancelled özelliğini kontrol edebilirsiniz böylece true DoWorkEventArgs arasında Cancel özelliğini ayarlamanız gerekir.

Ayrıca, kullanıcı arabiriminde yaşayan tüm denetimlere erişmemelisiniz. ProgressChanged (Docu) olayını kullanmanız daha iyi olur.

bakınız: hiçbir zaman işçi durdurma düğmesi ile benim orijinal kod güncelledik sürü BackgroundWorker Docu

+0

teşekkürler. aralarında "stop fonksiyonu ile güncellenmiş kod" yazan bir yorum yazdım. –

-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