Backgroundworker aber wie?

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Backgroundworker aber wie?

    Hallo.

    Ich habe in meine Projekt eine 8-Segmentanzeige, welche dreistellig ist.
    Jede Ziffer (8:8:8) kann über eine Eigenschaft befüllt werden. (100er, 10er, 1er)

    Nun möchte ich in dieser Anzeige ein Runterzählen simulieren mit einer For Schleife.
    Man sollte sehen wie von einer aktuellen zahl auf eine neue runter gezählt wird. Beisp:
    Aktuelle Zahl 200 neue Zahl 100

    VB.NET-Quellcode

    1. For i = 200 to 100 STEP -1
    2. Ui Element Neue Zahl setzen
    3. Threat.Sleep(1000)
    4. Next


    Nun funktioniert das mit Sleep nicht, da hier ja die UI nicht upgedatet wird.

    Jetzt habe ich es mit einem Backgroundworker versucht, aber da bekomme ich immer die Fehlermeldung, dass der Worker ausgelastet ist.
    Das liegt wohl daran, dass der Backgroundworker noch nicht fertig ist, wenn schon das nächste element in der Schleife kommt.

    VB.NET-Quellcode

    1. For i = 200 to 100 STEP -1
    2. Ui Element Neue Zahl setzen
    3. bgworker.RunWorkerAsync()
    4. Next
    5. Private Sub bgworker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgworker.DoWork
    6. Threading.Thread.Sleep(1000)
    7. End Sub


    Kann mir jemand sagen wie ich das richtig machen kann?

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub
    4. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    5. For i = 200 To 100 Step -1
    6. If Label1.InvokeRequired Then
    7. Label1.BeginInvoke(Sub() Label1.Text = i.ToString())
    8. End If
    9. System.Threading.Thread.Sleep(1000)
    10. Next
    11. End Sub


    So würde es funktionieren. Bei fragen einfach Fragen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Danke erstmal für deine Antwort.

    Leider benutze ich keine Label. Ich habe ein eigenes Steuerelement, welches keine Invoke Methode hat.
    Bei meinem Projekt handelt es sich um ein WPF Projekt. Ich hab aber den Thread hier erstellt, weil ich dachte es gibt
    da bei dem Backgroundworker keinen Unterschied, den scheint es aber doch auch hier zu geben. :(


    *Update*
    Ah Moment, die Invoke funktion liegt hier unter einem Dispatcher. Mal versuchen.


    *Update1*

    VB.NET-Quellcode

    1. Me.Dispatcher.BeginInvoke(Sub() UpdateDigits(iVal))


    Hat funktioniert! Super. Danke @xChRoNiKx

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    In .NET 4.5 gibt es auch Async/Await

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. ' For...
    4. Await Task.Delay(5000)
    5. Me.Dispatcher.BeginInvoke(Sub() UpdateDigits(iVal))
    6. ' Next
    7. End Sub
    8. End Class


    Meiner Meinung nach deutlich einfacher und verbraucht auch keine CPU Zeit. Deine UI blockiert nicht und macht erst weiter wenn die x-Sekunden rum sind.
    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    @gegy Wenn das Zählen selbst nicht CPU-lastig ist und Dein Programm offensichtlich nix weiter zu tun hat, brauchst Du keinen Thread usw., da genügt ein einfacher Timer.
    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!

    Gelöschter Benutzer schrieb:

    Nun möchte ich in dieser Anzeige ein Runterzählen simulieren mit einer For Schleife.
    Man sollte sehen wie von einer aktuellen zahl auf eine neue runter gezählt wird. Beisp:
    Aktuelle Zahl 200 neue Zahl 100
    Genau dafür gibts Async/Await, und Task.Delay.

    Dispatcher.BeginInvoke, Timer, Backgroundworker - kann alles in Tonne.

    Ich könnte auch zeigen wie, aber dazu brauche ich eine zumindest annähernd vollständige Methode - zumindest die Kopfzeile sollte mit dabei sein.