Hallo Com,
Wenn ihr ein Programm habt, das viel laden muss oder länger andauernde Operationen durchführt; ihr aber nicht wollt, dass der Nutzer das Programm nicht weiter nutzen kann, könnt ihr Folgendes mit einem BackGroundWorker anstellen:
Im "Haupt-Formular":
Und noch eine Generische Klasse für die Zwischenergebnisse der Tasks:
Wenn ihr ein Programm habt, das viel laden muss oder länger andauernde Operationen durchführt; ihr aber nicht wollt, dass der Nutzer das Programm nicht weiter nutzen kann, könnt ihr Folgendes mit einem BackGroundWorker anstellen:
Im "Haupt-Formular":
VB.NET-Quellcode
- Public ActionQueue As Queue(Of String) 'Die anstehendeen Operationen
- Public Shared TaskNames As Dictionary(Of String, String) 'Dafür anzuzeigende Namen (Statusleiste)
- Public Sub SetTask(ByVal tP As String)
- ActionQueue.Enqueue(tP)
- If Not bgwTasks.IsBusy Then
- progress.Value = 0
- progressLabel.Text = ""
- statTask.Text = TaskNames(ActionQueue.Peek().Split(":"c)(0)) 'Statusleisteneintrag
- bgwTasks.RunWorkerAsync(ActionQueue.Dequeue()) 'HIER wird der neue Task gestartet, wenn aktuell keine läuft
- End If
- End Sub
- Private Sub bgwTasks_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwTasks.DoWork
- Dim instruct As String = CStr(e.Argument) 'Der Task (Mit ":" als Trennzeichen für eventuell benötigte Argumente)
- Select Case instruct.Split(":"c)(0)
- Case "test" ' -> Test functions
- For i = 1 To 100
- Threading.Thread.Sleep(10 * CInt(instruct.Split(":"c)(1)))
- bgwTasks.ReportProgress(i, New BGWTaskReport(instruct))
- If bgwTasks.CancellationPending Then Exit Sub
- Next
- Case "test2"
- For i = 1 To 100
- Threading.Thread.Sleep(10 * CInt(instruct.Split(":"c)(1)))
- bgwTasks.ReportProgress(i, New BGWTaskReport(instruct))
- If bgwTasks.CancellationPending Then Exit Sub
- Next
- End Select
- End Sub
- Private Sub bgwTasks_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwTasks.ProgressChanged
- progress.Value = e.ProgressPercentage
- progressLabel.Text = String.Format("{0} %", e.ProgressPercentage)
- Dim task As BGWTaskReport = CType(e.UserState, BGWTaskReport)
- Select Case task.TaskName
- 'Hier je nach Task die "Ergebnisse" verwenden
- End Select
- End Sub
- Private Sub bgwTasks_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwTasks.RunWorkerCompleted
- progress.Value = 0
- progressLabel.Text = ""
- If ActionQueue.Count > 0 Then
- statTask.Text = TaskNames(ActionQueue.Peek().Split(":"c)(0)) 'Hier den nächsten Task starten
- bgwTasks.RunWorkerAsync(ActionQueue.Dequeue())
- Else
- statTask.Text = "Bereit."
- End If
- End Sub
Und noch eine Generische Klasse für die Zwischenergebnisse der Tasks:
VB.NET-Quellcode
- Public Structure BGWTaskReport
- Dim pStr As String
- Dim pRes As Object
- Public ReadOnly Property TaskName As String
- Get
- Return pStr
- End Get
- End Property
- Public ReadOnly Property TaskResult As Object
- Get
- Return pRes
- End Get
- End Property
- Public Sub New(ByVal instruction As String, Optional ByVal result As Object = Nothing)
- pStr = instruction
- pRes = result
- End Sub
- End Structure