7

バックグラウンドワーカーを停止し、作業中のすべてのプロセスを終了できるボタンを作成したいと考えています。

サンプルのバックグラウンド ワーカー コードは次のとおりです。

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

バックグラウンド ワーカーを停止したときに、ループをリセットしてプログレス バーを 0% に戻したいです。

これは可能ですか?


上記のコードは更新されており、現在は正常に動作しています。

do ループ内にこのコードを追加しました。

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

ワーカーを停止するボタンを作成しました。

    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
4

2 に答える 2

13

Backgroundworker クラスにはCancelAsync()、bgw の実行をキャンセルするために呼び出す必要があるメソッドがあります。

プロパティを trueに設定する必要がありBackgroundworker.WorkerSupportsCancellation、while ループ内でCancellationPending値がメソッドtrueの呼び出しを示しているかどうかをプロパティを確認する必要があります。CancelAsync()

CancellationPendingが true と評価された場合、オーバーロードされた( Docu ) メソッドの 1 つを呼び出して、ProgressBar の値を目的の値に設定します(既に行っているはずです)。ReportProgress()

編集:イベント内のプロパティを確認できるように、のCancelプロパティを true に設定する必要があります。DoWorkEventArgsCancelledRunWorkerCompletedEventArgsRunworkerCompleted

また、UI スレッドにあるコントロールにはアクセスしないでください。ProgressChanged( Docu ) イベントを使用することをお勧めします。

参照: BackgroundWorker ドキュメント

于 2013-08-26T05:47:26.720 に答える
-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
于 2014-08-30T14:36:30.653 に答える