Benutzer-Operationen als Hintergrundprozesse "abarbeiten"

    • VB.NET

      Benutzer-Operationen als Hintergrundprozesse "abarbeiten"

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

      VB.NET-Quellcode

      1. Public ActionQueue As Queue(Of String) 'Die anstehendeen Operationen
      2. Public Shared TaskNames As Dictionary(Of String, String) 'Dafür anzuzeigende Namen (Statusleiste)
      3. Public Sub SetTask(ByVal tP As String)
      4. ActionQueue.Enqueue(tP)
      5. If Not bgwTasks.IsBusy Then
      6. progress.Value = 0
      7. progressLabel.Text = ""
      8. statTask.Text = TaskNames(ActionQueue.Peek().Split(":"c)(0)) 'Statusleisteneintrag
      9. bgwTasks.RunWorkerAsync(ActionQueue.Dequeue()) 'HIER wird der neue Task gestartet, wenn aktuell keine läuft
      10. End If
      11. End Sub
      12. Private Sub bgwTasks_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwTasks.DoWork
      13. Dim instruct As String = CStr(e.Argument) 'Der Task (Mit ":" als Trennzeichen für eventuell benötigte Argumente)
      14. Select Case instruct.Split(":"c)(0)
      15. Case "test" ' -> Test functions
      16. For i = 1 To 100
      17. Threading.Thread.Sleep(10 * CInt(instruct.Split(":"c)(1)))
      18. bgwTasks.ReportProgress(i, New BGWTaskReport(instruct))
      19. If bgwTasks.CancellationPending Then Exit Sub
      20. Next
      21. Case "test2"
      22. For i = 1 To 100
      23. Threading.Thread.Sleep(10 * CInt(instruct.Split(":"c)(1)))
      24. bgwTasks.ReportProgress(i, New BGWTaskReport(instruct))
      25. If bgwTasks.CancellationPending Then Exit Sub
      26. Next
      27. End Select
      28. End Sub
      29. Private Sub bgwTasks_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwTasks.ProgressChanged
      30. progress.Value = e.ProgressPercentage
      31. progressLabel.Text = String.Format("{0} %", e.ProgressPercentage)
      32. Dim task As BGWTaskReport = CType(e.UserState, BGWTaskReport)
      33. Select Case task.TaskName
      34. 'Hier je nach Task die "Ergebnisse" verwenden
      35. End Select
      36. End Sub
      37. Private Sub bgwTasks_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwTasks.RunWorkerCompleted
      38. progress.Value = 0
      39. progressLabel.Text = ""
      40. If ActionQueue.Count > 0 Then
      41. statTask.Text = TaskNames(ActionQueue.Peek().Split(":"c)(0)) 'Hier den nächsten Task starten
      42. bgwTasks.RunWorkerAsync(ActionQueue.Dequeue())
      43. Else
      44. statTask.Text = "Bereit."
      45. End If
      46. End Sub


      Und noch eine Generische Klasse für die Zwischenergebnisse der Tasks:

      VB.NET-Quellcode

      1. Public Structure BGWTaskReport
      2. Dim pStr As String
      3. Dim pRes As Object
      4. Public ReadOnly Property TaskName As String
      5. Get
      6. Return pStr
      7. End Get
      8. End Property
      9. Public ReadOnly Property TaskResult As Object
      10. Get
      11. Return pRes
      12. End Get
      13. End Property
      14. Public Sub New(ByVal instruction As String, Optional ByVal result As Object = Nothing)
      15. pStr = instruction
      16. pRes = result
      17. End Sub
      18. End Structure