2

IISログを取得してデータベースに挿入するログパーサーをVB.Netで構築しようとしています。完全なデスクトップアプリケーションを実際に作成したことは一度もないので、私は多くの障害にぶつかっています。私の質問が非常に知らされていない場合は、ご容赦ください。私は走りながら歩くことを学んでいます。

私が使用しているコードは次のようになります。

 Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    MyBase.OnLoad(e)
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim logfile = "C:\ex111124.log"
    Dim FileLength As Long = New System.IO.FileInfo(logfile).Length
    logFileLabel.Text = logfile

    Dim objReader As New System.IO.StreamReader(logfile)
    Do While objReader.Peek() <> -1
        OngoingLog.AppendText(objReader.ReadLine)
        'BackgroundWorker1.ReportProgress(e.percentProgress)
        Loop()
    objReader.Close()
    objReader = Nothing

End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    'Me.crunchingProgress.Value = e.ProgressPercentage
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Close()
End Sub

したがって、この関数は機能します。このウィンドウを開くと、ログファイルの読み取りが開始され、現在読み取られているすべての行でテキストボックスが更新されますが、crunchingProgressというメインスレッドの進行状況バーも更新されます。

どんな助けでも大歓迎です。

4

2 に答える 2

2

これでうまくいくはずです:

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    Invoke(Sub()
        Me.crunchingProgress.Value = e.ProgressPercentage
    End Sub)
End Sub
于 2013-03-11T17:51:58.660 に答える
2

進行状況を報告するように BackgroundWorker を設定しない ( WorkerReportsProgress )

BackgroundWorker1.WorkerReportsProgress = True
BackgroundWorker1.RunWorkerAsync()

これBackgroundWorker1_ProgressChangedで、UI スレッドのコンテキストで呼び出され、プログレスバーの値を設定できます

もちろん、ReportProgress を呼び出して ProgressChanged イベントを発生させる場合は、これまでに完了した作業のパーセンテージを渡す必要があります。

Using objReader As New System.IO.StreamReader(logfile)
    Do While objReader.Peek() <> -1
        Dim line = objReader.ReadLine()
        OngoingLog.AppendText(line)
        Dim pct = Convert.ToInt32((100 * line.Length) / FileLength )
        BackgroundWorker1.ReportProgress(pct)
    Loop
End Using
于 2013-03-11T18:13:16.573 に答える