2013-03-11 75 views
2

我想在VB.Net中建立一个日志解析器,它将采用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的进度条。

任何帮助将不胜感激。

回答

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

谢谢,这个工作伴随着加入一些调用委派线程安全的潜艇其他控制更新 – 2013-03-11 19:38:57

+1

你并不需要调用调用一个ProgressChanged事件。它在调用RunWorkerAsync的同一线程中触发(通常是UI线程)。 http://stackoverflow.com/questions/1968222/backgroundworker-still-needs-to-call-invoke – Steve 2013-03-11 19:53:11

2

您没有设置BackgroundWorker的报告进度(WorkerReportsProgress

​​

现在你BackgroundWorker1_ProgressChanged将在UI线程的上下文中调用并且您可以设置进度条值

当然,当您调用ReportProgress来提升ProgressChanged事件时,您n希望通过迄今完成的工作比例。

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

我使用的是Visual Studio,所以我通过UI设置了另一个教程,我正在阅读的两个属性。 我意识到在提交我的问题后需要提供一些ProgressChanged事件,但感谢给我一个很好的方向来计算它。 – 2013-03-11 19:35:16