0

Visual Basic に Visual Studio 2013 を使用していますが、マルチスレッド プログラムのデバッグに苦労しています。

私は BackgroundWorker を使用していますが、これは私が考えている方法とは異なるように見えます。

と呼ばれる ArrayList の最初のエントリのみを処理した後にプログラムが停止する理由がわかりませんarFileName

次のコードでは、BackgroundWorker1.DoWork プロシージャのFor Eachステートメントが全体を反復処理できません。arFileName

Private Sub btnRun_Click(sender As Object, e As EventArgs) Handles btnSelectCsv.Click

    'arFileName is ArrayList and it has enormous counts
    ProgressBar1.Maximum = arFileName.Count

    Me.Cursor = Cursors.WaitCursor

    'Do background
    BackgroundWorker1.RunWorkerAsync()

    Me.Cursor = Cursors.Arrow

    MessageBox.Show("Finished!", "info", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)


End Sub


Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) _
    Handles BackgroundWorker1.DoWork

    Dim arNotFoundFile As New ArrayList

    'Confirm file exists
    For Each filename As String In arFileName ' Here!
        If Not IO.File.Exists(filename) Then

            arNotFoundFile.Add(filename)
            ProgressBar1.Value = ProgressBar1.Value + 1
        End If
    Next

End Sub
4

1 に答える 1

0

バックグラウンドワーカーは、進行状況を報告するように設定する必要があります

 BackgroundWorker1.WorkerReportsProgress = True

次に、典型的な実装は次のようになります。

Dim progress As Integer = 0

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    While (progress < 100)
        ' YOUR CODE HERE
        progress += 1
        BackgroundWorker1.ReportProgress(progress)
    End While
End Sub

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    ' YOUR PROGRESSBAR VALUE HERE, USING progress VARIABLE
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    MessageBox.Show("Work completed")
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.RunWorkerAsync()
End Sub

ご覧のとおり、進行状況変数を定義しました。これは、完了した作業のパーセンテージを追跡します。RunWorkerAsyncを使用して ( Form_Loadイベントで行う) バックグラウンドワーカーを開始した後、 ProgressChangedイベントによってその進行状況を追跡できます。ここでは、作業 ( DoWork ) によって変更された進行状況変数を使用します。これを使用して、プログレスバーの値プロパティを設定できます。最後に、すべてが完了したら、メッセージを適切なイベント、つまりRunWorkerCompletedに送信します。

于 2016-12-08T09:36:13.313 に答える