Backgroundworker überlastet

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Backgroundworker überlastet

    Ich hab mich vor kurzer Zeit mal mit den Backgroundworkern beschäftigt. Klappt auch alles, nur habe ich das Problem, dass ich einen BGWorker nicht beenden kann und danach wieder starten.
    Im Netz bzw. auch über die Forensuche konnte ich nichts über mein Problem herausfinden.

    C-Quellcode

    1. Private Sub PictureBox3_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox3.Click
    2. BgWorker.Dispose()
    3. BgWorker.CancelAsync()
    4. My.Computer.Audio.Play("XyZ")
    5. BgWorker.RunWorkerAsync()
    6. End Sub


    Es kommt immer die Fehlermeldung Dieser BGW ist derzeit ausgelastet. Er kann nicht ...

    Danke für Eure Hilfe

    dominik2001 schrieb:

    VB.NET-Quellcode

    1. BgWorker.Dispose()
    Dieser Befehl killt den BGW.
    Nimm ihn mal raus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Leider hat as nix gebracht

    Weiterhin Dieser BackgroundWorker ist derzeit ausgelastet und kann nicht mehrere Aufgaben gleichzeitig ausführen.

    @SpaceyX

    C-Quellcode

    1. Private Sub BgWorker_DoWork() Handles BgWorker.DoWork
    2. While True
    3. Try
    4. Dim result7 As MySqlLib.ResultCollection = db.Query("SELECT * ...")
    5. Dim rechte7() As String = {result7.Row(0).Column("XYZ")}
    6. Dim resultDME As MySqlLib.ResultCollection = db.Query("SELECT * ...")
    7. Dim count As String = resultDME.Row.Count
    8. If result7.Row.Count = 0 Then
    9. Else
    10. For h As Integer = 0 To count - 1
    11. Dim b As String = resultDME.Row(h).Column("RIC")
    12. For Each m As String In rechte7
    13. If m.Contains(b) Then
    14. nummer.Invoke(Sub() nummer.Text = result7.Row(0).Column("Nummer"))
    15. adresse.Invoke(Sub() adresse.Text = result7.Row(0).Column("Strasse"))
    16. stichwort.Invoke(Sub() stichwort.Text = result7.Row(0).Column("Stichwort"))
    17. meldung.Invoke(Sub() meldung.Text = result7.Row(0).Column("Meldung"))
    18. lbl_typ.Invoke(Sub() lbl_typ.Text = result7.Row(0).Column("Typ"))
    19. My.Computer.Audio.Play("sounds\...")
    20. BgWorker.CancelAsync() '<- damit der Text der Labels nicht aktualisiert wird, solange man nicht auf einen Knopf drückt, damit der BGW wieder gestartet wird, was abe rleider nicht geht.
    21. Else
    22. End If
    23. Next
    24. Next
    25. End If
    26. Catch ex As Exception
    27. End Try
    28. End While
    29. End Sub

    also hab ich jetzt

    C-Quellcode

    1. Catch ex As Exception
    2. BgWorker.CancelAsync()
    3. End Try


    eingefügt

    Aber der BGWorker soll ja solang laufen, wie die Form offen ist, also while true

    Ich muss ihn doch aber trotzdem iwie stoppen können?
    Davor hatte ich statt dem BGW einen Timer, der dann aber verursacht hat, dass die Form die ganze Zeit ruckelt. Also war meine Idee, den Timer durch nen BGW zu ersetzen. Deshlab soll er ja auch die ganze Zeit laufen, damit er immer die aktuellsten Daten in die Labels schreibt.

    dominik2001 schrieb:

    statt dem BGW einen Timer
    Fang an und pack das ganze in eine Button_Click. Dann sehen wir, wie lange das dauert, und wenn es doch zu lange dauert, packen wir es in einen Thread.
    Kann es sein, dass Du den BGW startest, bevor er seine Arbeit getan hat? Das wäre suboptimal.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RFG,
    einfach den ganzen Code vom BGW in ein Button_Click?

    Kann mir aber eigentlich nicht vorstellen, dass es lange dauert, denn wenn die Daten in der DB sind, sind sie sofort im Label.

    Wenn man auf den Button drückt, stoppt der BGW zuerst BgWorker.CancelAsync() und dann starte ich ihn wieder BgWorker.RunWorkerAsync().

    @Erfinder
    Wie geht das mit dem System.Threading.Timer
    Ich mag dir das jetzt nicht alles hinprogrammieren.
    Lerne selbst mittm VisualStudio umzugehen - eine Menge kannste dir hier abgucken: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Damit kannst du den Timer suchen, und wenn man einigermaßen Vb.net versteht, dann reichen die Informationen des OBs aus, dass man den richtig einsetzen kann.

    dominik2001 schrieb:

    Kann mir aber eigentlich nicht vorstellen, dass es lange dauert
    passt nicht zu einem überlasteten BGW.
    Ja, pack den ganzen Code (besser: den Aufruf davon) in eine Button_Click.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!