BackgroundWorker vs. Async / Await

16

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

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

Bedeutet neueres besser? Was ist der Unterschied zwischen den beiden Methoden? Wie wähle ich die Methode aus, mit der 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.

robert.ecot
quelle

Antworten:

10

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

Das neue C # 5 asyncund die awaitSchlüsselwörter vereinfachen im Grunde nur das Schreiben von lesbarem asynchronem Code. Es gibt möglicherweise weniger Tutorials und Beispiele, wie Sie mit diesen Schlüsselwörtern verschiedene Aufgaben ausführen können, als BackgroundWorker.

Sofern Sie keine ältere Version von C # benötigen, empfehle ich Ihnen, sich mit asyncund vertraut zu machen await.

M. Dudley
quelle
13

Mit den Schlüsselwörtern asyncund awaitwird Ihre Anwendung nicht selbst reaktionsschneller. Sie vereinfachen einfach den Aufruf und die Handhabung von Methoden, die TaskObjekte zurückgeben. Um Hintergrund-Threads zu erstellen async/ awaittatsächlich zu verwenden, müssen Sie die Verwendung von Dingen kombinieren wie:

  • Task.Start()- Startet eine bestimmte Aufgabe mit der Taste TaskScheduler.
  • PLINQ - Eine Reihe von Operationen parallel ausführen, eine Task zurückgeben.
  • TaskCompletionSource- Eine benutzerdefinierte Methode zur Bearbeitung von asynchronen Aufgaben. Ein Ort, an dem ich dies benutzte, war das Behandeln von Ereignissen, die von einer WebBrowserSteuerung kamen.
  • Andere asyncMethoden, wie z. B. viele der Funktionen in der Win 8-API.

Mit anderen Worten, async/ awaitist eine Erweiterung des aufgabenbasierten asynchronen Musters . Sie können eine große Vielzahl von Informationen, darunter auch viele Proben, finden hier .

Hierbei BackgroundWorkerhandelt es sich um eine WinForms-Komponente, die einen Hintergrundthread mithilfe des ereignisbasierten asynchronen Musters erstellt , und Sie können die in diesem Hintergrundthread durchgeführten Arbeiten mit Ihrem eigenen Code im DoWorkEreignishandler auffüllen. Im Allgemeinen empfiehlt Microsoft die Verwendung dieses Musters nicht mehr (siehe unten auf der Seite hier ). Wenn Sie jedoch bereits mit dem Muster vertraut sind, ist es möglicherweise immer noch eine einfache Option.

Eine weitere nicht erwähnte Option sind die Reactive Extensions für .NET . Dies ist ein weiteres großartiges Framework, um Ihren Apps mehr Reaktionsfähigkeit zu verleihen.

Kevin McCormick
quelle
Bedeutet dies, dass die Async-Funktionen unter Windows 7 (meiner Zielplattform) nicht so gut unterstützt werden?
robert.ecot
1
Hallo Robert, die Win 8 .NET-API (für Apps im "Metro" -Stil) verwendet Async und wartet auf alles, von Datei-E / A bis zum Anzeigen von Dialogfeldern. In anderen .NET-Komponenten, z. B. FileStream, können Sie auch async / await mit Methoden wie Stream.ReadAsync verwenden. Es gibt also auch Unterstützung außerhalb von Win 8.
Kevin McCormick
Super, und danke auch für die aktualisierten Links! Sehr hilfreich.
robert.ecot
1
Ich sehe auf dieser Seite nichts, was darauf hindeutet, dass BackgroundWorkerausdrücklich dagegen geraten wird.
Kyralessa
Ich empfehle auch die Lektüre von Async VS BackgroundWorker und die Reihe von Blogposts über Concurrent Programming in C # von Stephen Clearly, dem Autor des von O'Reilly herausgegebenen gleichnamigen Buches.
Sentenza
3

Ich würde sagen, dass async- awaitist viel flexibler als BackgroundWorker. Und wenn Sie wollen , etwas zu tun , dass paßt BackgroundWorker, Sie tun können , es mit async- awaitauch mit lesbarem und typsichere Code.

Aus diesem Grund denke ich , sollten Sie mit bevorzugen async- awaitüber BackgroundWorker.

svick
quelle