CSharp lieber BackgroundWorker oder Async Await?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Berufserfahrung

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.