Task paralleler Bibliotheksersatz für BackgroundWorker?

83

Hat die Task-Parallel-Bibliothek etwas, das als Ersatz oder Verbesserung gegenüber der BackgroundWorker-Klasse angesehen werden könnte?

Ich habe eine WinForms-Anwendung mit einer Benutzeroberfläche im Assistentenstil, die einige lang laufende Aufgaben ausführt. Ich möchte eine reaktionsfähige Benutzeroberfläche mit dem Standard-Fortschrittsbalken und der Möglichkeit haben, den Vorgang abzubrechen. Ich habe dies bereits mit BackgroundWorker gemacht, aber ich frage mich, ob es einige TPL-Muster gibt, die stattdessen verwendet werden können.

Keith G.
quelle

Antworten:

91

Die TaskKlasse ist eine Verbesserung gegenüber der BackgroundWorker; Es unterstützt natürlich die Verschachtelung (übergeordnete / untergeordnete Aufgaben), verwendet die neue Abbruch-API, Aufgabenfortsetzungen usw.

Ich habe ein Beispiel in meinem Blog , das die alte BackgroundWorkerund die neue TaskArt, Dinge zu tun, zeigt. Ich habe eine kleine Hilfsklasse für Aufgaben, die den Fortschritt melden müssen, da ich die Syntax ziemlich umständlich finde. Das Beispiel behandelt Ergebniswerte, Fehlerbedingungen, Stornierung und Fortschrittsberichte.

Stephen Cleary
quelle
Es ist schwierig, sich zwischen dieser und Hatchs Antwort zu entscheiden, da seine Antwort technisch korrekt ist. Ihr Blog zeigt jedoch, wie die neue Task-Klasse verwendet wird, und genau danach habe ich gesucht - eine Weiterentwicklung von BackgroundWorker. Ich verwende Ihr Beispiel als Grundlage für Code in meiner Anwendung.
Keith G
2
Vor ein paar Tagen habe ich einen Vergleich verschiedener Hintergrundverarbeitungstechniken geschrieben . BackgroundWorkerhat eine einfachere Fortschrittsberichterstattung und Taskermöglicht das Verschachteln. Von den beiden bevorzuge ich Task(es ist viel einfacher, Fortschrittsberichte zu bereinigen, als das Verschachteln zuzulassen). Beide sind jedoch anderen gängigen Lösungen um Lichtjahre voraus. Ich erschrecke, wenn ich von Leuten höre, die Threadoder benutzen ThreadPool.QueueUserWorkItem. Sie sind für Hintergrundaufgaben am schwierigsten zu verwenden.
Stephen Cleary
Einfachere Fortschrittsberichterstattung? Nur wenn Sie nur einen Prozentsatz melden möchten. Um etwas anderes zu melden, muss begininvoke oder SynchronizationContext.Post
hässlich sein
5
@PanagiotisKanavos: Sie können jedes beliebige Objekt als übergeben userState. In den 2,5 Jahren seit meinem letzten Kommentar wurde Taskjedoch mit IProgress<T>und ergänzt Progress<T>, die sauberer und einfacher sind als BackgroundWorkerder Fortschritt. Im modernen Code gibt es keinen Grund BackgroundWorkermehr, ihn zu verwenden.
Stephen Cleary
Ja, ich habe es gerade bemerkt. Irgendwie kam dieser Beitrag ganz oben, als ich auf das TPL-Tag klickte, um neue Fragen zu finden!
Panagiotis Kanavos
23

Der Hintergrund-Worker ist immer noch ein gültiger Weg, um dies zu erreichen. Wenn Sie mehrere große Vorgänge gleichzeitig ausführen, sind die parallelen Erweiterungen eine Überlegung wert. Wenn es nur der eine ist, würde ich mich an den Hintergrund-Worker halten.

Luke
quelle