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.
Antworten:
Die
Task
Klasse ist eine Verbesserung gegenüber derBackgroundWorker
; 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
BackgroundWorker
und die neueTask
Art, 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.quelle
BackgroundWorker
hat eine einfachere Fortschrittsberichterstattung undTask
ermöglicht das Verschachteln. Von den beiden bevorzuge ichTask
(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, dieThread
oder benutzenThreadPool.QueueUserWorkItem
. Sie sind für Hintergrundaufgaben am schwierigsten zu verwenden.userState
. In den 2,5 Jahren seit meinem letzten Kommentar wurdeTask
jedoch mitIProgress<T>
und ergänztProgress<T>
, die sauberer und einfacher sind alsBackgroundWorker
der Fortschritt. Im modernen Code gibt es keinen GrundBackgroundWorker
mehr, ihn zu verwenden.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.
quelle