2010-08-18 7 views
75

Hat die parallele Aufgabenbibliothek irgendetwas, das als Ersatz oder Verbesserung gegenüber der BackgroundWorker-Klasse betrachtet werden würde?Task paralleler Bibliotheksersatz für BackgroundWorker?

Ich habe eine WinForms-Anwendung mit einer Wizard-UI, und es dauert einige lange laufende Aufgaben. Ich möchte eine reaktionsfähige Benutzeroberfläche mit der Standardfortschrittsleiste und die Möglichkeit haben, den Vorgang abzubrechen. Ich habe das schon vorher mit BackgroundWorker gemacht, aber ich frage mich, ob es einige TPL-Muster gibt, die stattdessen verwendet werden können?

+0

Siehe auch http://stackoverflow.com/questions/4054263/how-does-c-sharp-5-0s-async-await-feature-differ-from-the-tpl und http://stackoverflow.com/questions/12414601/async-await-vs-backgroundworker – nawfal

Antwort

87

Die Klasse Task ist eine Verbesserung gegenüber der BackgroundWorker; es unterstützt natürlich Verschachtelung (Eltern/Kind-Aufgaben), verwendet die neue Stornierung API, Aufgabe Fortsetzungen usw.

I have an example on my blog, die alte BackgroundWorker Art und Weise, Dinge zu tun und die neue Task Art und Weise, Dinge zu tun zeigt. Ich habe eine kleine Hilfsklasse für Aufgaben, die den Fortschritt melden müssen, weil ich die Syntax eher peinlich finde. Das Beispiel umfasst Ergebniswerte, Fehlerbedingungen, Stornierung und Fortschrittsberichte.

+0

Tough Entscheidung zwischen diesem und Hatch's Antwort, da seine technisch eine richtige Antwort ist. In Ihrem Blog wird jedoch gezeigt, wie die neue Task-Klasse verwendet wird, und genau das habe ich gesucht - eine Weiterentwicklung von BackgroundWorker. Ich verwende Ihr Beispiel als Grundlage für Code in meiner Anwendung. –

+2

Vor ein paar Tagen schrieb ich einen [Vergleich verschiedener Hintergrundverarbeitungstechniken] (http://nitoprograms.blogspot.com/2010/08/various-implementations-of-asynchronous.html). 'BackgroundWorker' hat eine einfachere Fortschrittsmeldung, während' Task' die Verschachtelung erlaubt. Von den beiden bevorzuge ich "Task" (es ist * viel * einfacher, Fortschrittsberichte zu bereinigen, als das Verschachteln zuzulassen). Sie sind jedoch beide Lichtjahre anderen gemeinsamen Lösungen voraus. Ich schaudere, wenn ich von Leuten höre, die 'Thread' oder' ThreadPool.QueueUserWorkItem' benutzen. Sie sind die absolut am schwierigsten zu verwendenden Hintergrundaufgaben. –

+0

Leichtere Fortschrittsberichte? Nur wenn Sie nur einen Prozentsatz angeben möchten. Wenn Sie etwas anderes melden möchten, müssen Sie begininvoke oder SynchronizationContext.Post hugliness starten. –

23

Hintergrundarbeiter ist immer noch ein gültiger Weg, dies zu erreichen - wenn Sie mehrere große Operationen gleichzeitig ausführen, wäre die parallele Erweiterungen eine Überlegung wert, wenn es nur die eine wäre dann würde ich mit dem Hintergrundarbeiter bleiben.

+2

Und der Bgw wird von dem verbesserten ThreadPool profitieren –