Frage

Mindestens seit der Veröffentlichung von .NET 4.0, scheint Microsoft viel Mühe in der Unterstützung für parallele und asynchrone Programmierung gesetzt zu haben, und es scheint eine Menge von APIs und Bibliotheken um diesen entstanden ist. Insbesondere werden die folgenden Phantasienamen ständig überall in letzter Zeit erwähnt:

  • Reactive Framework
  • PLINQ (Parallel LINQ)
  • TPL (Taskbibliothek Parallel) und
  • Parallel Extensions.

Jetzt alles, was sie scheinen Microsoft-Produkten zu sein, und sie alle scheinen für .NET asynchrone oder parallele Programmierung Szenarien zu zielen. Aber es ist nicht ganz klar ist, was jeder von ihnen tatsächlich ist und wie sie miteinander in Beziehung. Man könnte eigentlich das Gleiche sein.

In wenigen Worten, jeder kann für klare Verhältnisse sorgen auf das, was ist, was?

War es hilfreich?

Lösung

PLINQ (Linq Parallel) ist einfach eine neue Art und Weise regelmäßige Linq zu schreiben fragt, so dass sie parallel laufen - in anderen Worten, der Rahmen kümmert sich automatisch um Ihre Abfrage über mehrere Threads laufen so dass sie schneller (dh mit mehreren CPU-Kerne) zu beenden.

Zum Beispiel, sagen wir, dass Sie eine Reihe von Zeichenketten haben und Sie möchten alle diejenigen erhalten, die mit dem Buchstaben „A“ beginnen. Sie könnten Ihre Abfrage wie folgt schreiben:

var words = new[] { "Apple", "Banana", "Coconut", "Anvil" };
var myWords = words.Select(s => s.StartsWith("A"));

Und das funktioniert gut. Wenn Sie 50.000 Wörter hatte zu suchen, obwohl, können Sie sich die Tatsache zunutze zu tragen, dass jeder Test unabhängig ist, und teilen diese auf mehrere Cores:

var myWords = words.AsParallel().Select(s => s.StartsWith("A"));

Das ist alles, was Sie tun müssen, um eine regelmäßige Abfrage in ein parallel man, dass läuft auf mehreren Kerne zu drehen. Recht ordentlich.


Die TPL (Taskbibliothek Parallel) ist eine Art der Ergänzung zu PLINQ, und zusammen bilden sie Parallel Extensions auf. Während PLINQ beruht weitgehend auf einem funktionelle Stil der Programmierung mit keine Nebenwirkungen, Nebenwirkungen sind genau das, was die TPL für ist. Wenn Sie wirklich wollen funktionieren parallel als nur Suche im Gegensatz / Dinge parallel Auswahl verwenden Sie die TPL.

Die TPL ist im Wesentlichen die Parallel Klasse, die Überlastung von For, Foreach und Invoke aussetzt. Invoke ist ein bisschen wie Aufgaben im ThreadPool Schlange stehen, aber ein bisschen einfacher zu bedienen. IMO, sind die interessanteren Bits die For und Foreach. So zum Beispiel, sagen wir Ihnen eine ganze Reihe von Dateien haben Sie komprimieren möchten. Sie könnten die reguläre sequentielle Version schreiben:

string[] fileNames = (...);
foreach (string fileName in fileNames)
{
    byte[] data = File.ReadAllBytes(fileName);
    byte[] compressedData = Compress(data);
    string outputFileName = Path.ChangeExtension(fileName, ".zip");
    File.WriteAllBytes(outputFileName, compressedData);
}

Auch hier jede Iteration dieser Kompression ist völlig unabhängig von jedem anderen. Wir können einige von ihnen tun dies bis beschleunigen, indem Sie einmal:

Parallel.ForEach(fileNames, fileName =>
{
    byte[] data = File.ReadAllBytes(fileName);
    byte[] compressedData = Compress(data);
    string outputFileName = Path.ChangeExtension(fileName, ".zip");
    File.WriteAllBytes(outputFileName, compressedData);
});

Und wieder, das ist alles es nimmt diesen Vorgang parallelisieren. Nun, wenn wir unsere CompressFiles Methode laufen (oder was auch immer wir uns entscheiden, es zu nennen), wird es mehr CPU-Kern verwenden und wahrscheinlich in der Hälfte oder 1/4 die Zeit zu beenden.

Der Vorteil dabei über nur alles in den ThreadPool Aufspannung ist, dass dies tatsächlich läuft synchron . Wenn Sie die ThreadPool verwendet stattdessen (oder einfach nur Thread Instanzen), dann würden Sie haben einen Weg zu kommen, herauszufinden, wenn alle Aufgaben fertig sind, und während dies nicht der Fall ist schrecklich kompliziert etwas, es ist, dass eine Menge Leute vermasseln neigen oder zumindest haben Probleme mit. Wenn Sie die Parallel-Klasse verwenden, Sie haben nicht wirklich darüber nachzudenken; der Multi-Threading Aspekt von dir verborgen ist, es ist alles hinter den Kulissen behandelt wird.


Reactive Extensions (Rx) sind wirklich ein anderes Tier zusammen. Es ist eine andere Art und Weise über die Ereignisbehandlung zu denken. Es gibt wirklich eine Menge Material zu bedecken, auf diesem, aber eine lange Geschichte kurz zu machen, statt verdrahten up Event-Handler Ereignisse, Rx können Sie Ereignisfolgen behandeln, wie ... na ja, Sequenzen (IEnumerable<T>). Sie erhalten auf Prozessereignisse in einer iterativen Weise, anstatt sie asynchron zu zufälligen Zeiten abgefeuert, wo Sie Zustand der ganze Zeit, um eine Reihe von Veranstaltungen halten müssen sparend in einer bestimmten Reihenfolge geschehen zu erkennen.

Eines der coolsten Beispiele, die ich von Rx gefunden habe, ist Zusammensetzung von Veranstaltungen, etwas, das man nicht wirklich mit regelmäßigen Event-Handler hat, und Code-Schnipsel wie diese sind auch einfach zu refactor in Verhalten Klassen, dass Sie in jedem Ort Hülse können.


Und das ist es. Dies sind einige der Kühler Funktionen, die in .NET 4.0 verfügbar sind. Es gibt mehr, natürlich, aber diese waren die, die Sie gefragt!

Andere Tipps

Ich mag Aaronaught Antwort, aber ich würde sagen, Rx und TPL verschiedene Probleme lösen. Teil dessen, was das TPL-Team hinzugefügt sind die Threading-Primitiven und bedeutende Verbesserungen an den Bausteinen der Laufzeit wie die Threadpool. Und alles, was Sie Liste auf diesen Primitiven und Runtime-Funktionen eingebaut ist.

Aber die TPL und Rx lösen zwei verschiedene Probleme. TPL funktioniert am besten, wenn das Programm oder Algorithmus ist ‚Ziehen & Warteschlangen‘. Rx zeichnet, wenn das Programm oder Algorithmus Bedürfnisse ‚reagieren‘, um Daten aus einem Strom (wie Mauseingabe oder wenn einen Strom von zugehörigen Nachrichten von einem Endpunkt wie WCF Empfangen).

würden Sie müssen die ‚Arbeitseinheit‘ -Konzept von TPL Arbeit wie das Dateisystem zu tun, über eine Sammlung iterieren, oder eine Hierarchie wie ein Organigramm zu Fuß. In jedem dieser Fälle kann der Programmierer Grund, sich über die Gesamtmenge der Arbeit kann die Arbeit nach unten in Stücke einer bestimmten Größe (Aufgaben) gebrochen werden, und im Fall von Berechnungen über eine Hierarchie tun können die Aufgaben sein ‚gekettet‘ zusammen . So bestimmte Arten von Arbeiten eignen sich für die TPL ‚Task-Hierarchie‘ -Modell, und profitieren von den Verbesserungen Sanitär wie cancellation (siehe Channel 9 Video auf CancellationTokenSource). TPL hat auch viele Knöpfe für spezialisierte Bereiche wie in der Nähe von Echtzeit-Datenverarbeitung.

Rx wird, was die meisten Entwickler, die mit am Ende soll. Es ist, wie WPF-Anwendungen können auf externe Nachrichten wie externe Daten (Strom von IM-Nachrichten an ein IM-Client) oder die externen Eingang (wie die Maus zieht Beispiel aus Aaronaught verbunden) ‚reagieren‘. Unter den Abdeckungen Rx verwendet Primitiven von TPL / BCL, THREAD Sammlungen von TPL / BCL und Laufzeitobjekten wie der Thread Threading. In meinem Kopf ist Rx die ‚höchste Ebene‘ der Programmierung Ihre Absichten auszudrücken.

Ob der durchschnittliche Entwickler ihren Kopf um die Menge von Absichten gewickelt bekommen können Sie mit Rx ausdrücken können, ist noch zu sehen. :)

Aber ich denke, die nächsten paar Jahre die TPL vs. Rx wird die nächste Debatte wie LINQ-to-SQL vs. Entity Framework sein. Es gibt zwei Arten von API in der gleichen Domäne und sind für verschiedene Szenarien spezialisiert, sondern überschneiden sich in vielerlei Hinsicht. Aber im Fall von TPL & Rx sie sind tatsächlich voneinander wissen und es sind integrierte Adapter-Anwendungen zu schreiben und beide Frameworks zusammen (wie Fütterung ergibt sich aus einer PLINQ Schleife in einen IObservable Rx-Stream). Für die Leute, die keine parallele Programmierung getan haben, gibt es eine Tonne zu lernen Geschwindigkeit zu bekommen.

Update: Ich habe beide TPL benutze und RxNet in meiner regulären Arbeit für die letzten 6 Monate (von den 18 Monaten seit meiner ursprünglichen Antwort). Meine Gedanken der Wahl von TPL und / oder RxNet in einem mittleren Ebene WCF-Dienst (Enterprise Service LOB): http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top