CSharp lieber BackgroundWorker oder Async Await?
Ich will wissen was das beste wär für mein program(winforms).
Das program ruft viele methoden auf die for & while schleifen enthalten.
Ich setzte eigentlich immer nen BackgroundWorker ein damit die form nicht einfriert bei einer loop. Aber es giebt ja aync & await und ich will wissen was dass bessere wär für einen void der schleifen enthält.
2 Antworten
Tasks bzw. Async/Wait wurden dafür gebaut, den BackgroundWorker abzulösen.
Die Frage, was Du nutzen solltest, ist ziemlich einfach: Tasks mit Async/Await
Aber ließ dich vorher gründlich ein.
Falsch angewandt kannst Du dir fiese Fehlerquellen bauen.
So solltest Du z.B. niemals synchron (Wait-Methode oder Result-Property) auf einen Task warten, außer Du bist dir wirklich sicher. Im Falle von WinForms oder WPF hast Du dir damit nämlich ganz schnell einen Deadlock gebaut.
Und auf GAR KEINEN FALL auf einen Task warten, ohne dass die Methode selber einen Task zurück gibt. Das Problem dabei ist nämlich, dass der Task im Hintergrund arbeitet, aber Du nirgendwo die Möglichkeit hast, darauf zu reagieren, ob er fertig ist oder einen Fehler hatte. Ich musste Mal an einem Programm arbeiten, wo das nur so gemacht wurde und es war eine Qual, solche simplen Dinge wie "Aufgabe erledigt"-Meldungen anzuzeigen.
Die einzige Ausnahme sind EventHandler und da sollte man dann zusätzlich sicherstellen, dass das Event nicht nochmal ausgeführt werden kann, solange der Task noch läuft.
Das mag jetzt vielleicht Abschreckend klingen, aber ich kann dir versichern, die Vorteile überwiegen, doch man sollte zumindest grob verstanden haben, wie das alles funktioniert.
Ähnliche Probleme hast Du beim BackgroundWorker natürlich auch, doch bei den Tasks wird das leicht übersehen, da sie im ersten Moment so einfach aussehen.
Nimm Async Await. Das reicht aus damit die GUI normal weiterläuft du musst dir nach dem Await aber keine Sorgen um Tasksynchronisierung machen. Das wird im Hintergrund von C# erledigt. Wenn die Tasks keine eigenen Threads erstellt verwendet Async Await auch keine zusätzlichen Tasks sondern erstellt lediglich eine Statemachine die im selben Thread abfragt ob eine Aufgabe bereist erledigt ist oder ein Signal aktiviert wurde.
Asnyc Await ist also gut wenn du auf irgendwelche Ereignisse warten willst.
Wirkliche Berechnungen musst du hald immer noch in einem Thread machen aber du kannst mit Task.Run Async und Await auf die Fertigstellung des Tasks warten.