it-swarm.com.de

BackgroundWorker vs. Async / Await

Ich bin neu in der C # -Entwicklung und möchte eine reaktionsschnellere Benutzeroberfläche erstellen. In meinen vorläufigen Untersuchungen habe ich zwei Methoden gesehen, um dies zu erreichen:

  1. Multithreading in Verbindung mit der BackgroundWorker-Klasse.
  2. Die neueren Async/Await-Modifikatoren.

Bedeutet neuer besser? Was ist der Unterschied zwischen den beiden Methoden? Wie wähle ich die Methode aus, wenn ich ein neues Projekt erstellen möchte?

EDIT: Vielleicht sollte ich angeben. Ich erstelle eine Windows Forms-Anwendung, in der alle erforderlichen Daten auf der lokalen Festplatte gespeichert/geladen werden. Ich werde auch mit mehreren USB-Geräten kommunizieren.

17
robert.ecot

Sie können Ihre Aufgabe mit BackgroundWorker erledigen. Es ist eine bekannte Klasse, und viele Leute haben sie benutzt.

Die neuen Schlüsselwörter C # 5 async und await erleichtern im Grunde nur das Schreiben von lesbarem asynchronem Code. Möglicherweise gibt es weniger Tutorials und Beispiele, wie verschiedene Aufgaben mit diesen Schlüsselwörtern ausgeführt werden können, als BackgroundWorker.

Sofern Sie keine ältere Version von C # verwenden müssen, empfehle ich, die Verwendung von async und await zu erlernen.

10
M. Dudley

Die Schlüsselwörter async und await machen Ihre Anwendung für sich genommen nicht reaktionsfähiger. Sie machen einfach das Aufrufen und Behandeln von Methoden, die Task Objekte zurückgeben, bequemer. Damit async/await tatsächlich Hintergrundthreads verwendet, müssen Sie Folgendes verwenden:

  • Task.Start() - Startet eine bestimmte Aufgabe mit TaskScheduler.
  • PLINQ - Führen Sie eine Reihe von Operationen parallel aus und geben Sie eine Aufgabe zurück.
  • TaskCompletionSource - Eine benutzerdefinierte Methode zum Behandeln von asynchronen Aufgaben. Ein Ort, an dem ich dies verwendet habe, war die Behandlung von Ereignissen, die von einem WebBrowser Steuerelement stammen.
  • Andere async Methoden, wie z. B. viele der Funktionen in der Win 8-API.

Mit anderen Worten, async/await ist eine Erweiterung des aufgabenbasierten asynchronen Musters. Sie finden eine große Menge an Informationen, einschließlich vieler Beispiele, hier .

Das BackgroundWorker ist eine WinForms-Komponente, die 1 Hintergrundthread mit dem ereignisbasiertes asynchrones Muster erstellt. Sie können die an diesem Hintergrundthread geleistete Arbeit mit Ihrem eigenen Code im DoWork Ereignishandler. Im Allgemeinen empfiehlt Microsoft nicht mehr, dieses Muster zu verwenden (siehe unten auf der Seite hier ), obwohl Sie damit vertraut sind mit ihm kann es schon eine einfache Option sein.

Eine andere Option, die nicht erwähnt wird, ist Reactive Extensions for .NET . Dies ist ein weiterer großartiger Rahmen, um Ihren Apps mehr Reaktionsfähigkeit zu verleihen.

14
Kevin McCormick

Ich würde sagen, dass async-await viel flexibler ist als BackgroundWorker. Und wenn Sie etwas tun möchten, das zu BackgroundWorker passt, können Sie dies auch mit async-await tun, mit besser lesbarem und typsicherem Code.

Aus diesem Grund sollten Sie lieber async-await als BackgroundWorker verwenden.

3
svick