Ich fand Unterschiede zwischen [...] Async und Begin [...] .net asynchronen APIs Frage, aber diese Antwort hat mich ein wenig verwirrt.
Über diese Muster sprechend sagte Stephen:
Most * Async-Methoden (mit entsprechenden * Completed-Ereignissen) verwenden das ereignisbasierte asynchrone Muster. Das ältere (aber immer noch gültige) Begin * und End * ist ein Muster namens Asynchronous Programming Model.
Die Socket-Klasse ist eine Ausnahme von dieser Regel; Seine * Async-Methoden haben keine entsprechenden Ereignisse; Es ist im Wesentlichen nur APM in einer Weise, um übermäßige Speicherzuweisungen zu vermeiden.
Ich verstehe es mit * Async-Methoden sind effizienter, zumindest wenn es um Sockets geht. Aber dann erwähnte er Task Parallel Library:
APM und EBAP werden jedoch durch einen viel flexibleren Ansatz ersetzt, der auf der Task Parallel Library basiert. Da die TPL APMs leicht umbrechen kann, werden ältere Klassen wahrscheinlich nicht direkt aktualisiert. Erweiterungsmethoden werden verwendet, um Task-Äquivalente für die alten APM-Methoden bereitzustellen.
Ich fand TPL und traditionelle .NET Asynchronous Programming auf MSDN, ich kenne die Grundlagen von TPL, Erstellen von Aufgaben, Stornierungen, Fortsetzungen, usw., aber ich verstehe immer noch nicht, diese:
Was sind die Vorteile von Asynchronous Programming Model (APM) und Event-Based Asynchronous Pattern (EAP) im Vergleich zueinander? Wie kann TPL APMs leicht verpacken bedeuten, dass APM und EAP durch TPL ersetzt werden?
Und am wichtigsten: Was sollte ich bei der Socket-Programmierung verwenden?
Wie kann TPL APMs umhüllen, so dass APM und EAP durch TPL ersetzt werden?
Es tut es nicht. Ob APM und EAP durch TAP (Task Asynchronous Pattern) oder nicht in neuen APIs ersetzt werden, hat damit nichts zu tun. Ich würde erwarten, dass TAP APM und EAP aus verschiedenen Gründen ersetzt. Der Hauptgrund für mich ist, dass der Code, den Sie für die Verwendung des TAP schreiben, viel besser zusammenpasst. Doing .ContinueWith(/* ... */).ContinueWith(/* ... */)
liest im Allgemeinen viel besser als der entsprechende Code, den Sie schreiben müssten, um Async-Aufrufe über Begin / End-Methoden zu verketten, auch wenn Sie die Optionen nicht berücksichtigen, die Sie an ContinueWith übergeben können, um festzustellen, ob die Fortsetzung ausgeführt werden soll . Die TPL bietet auch verschiedene Kombinatoren für Aufgaben, z. B. WaitAll
und WaitAny
, die einige Szenarien erheblich vereinfachen können. Die Sprachunterstützung in C # und VB.NET über die async / await-Schlüsselwörter wird dies noch einfacher machen.
Die Möglichkeit, APMs in den TAP zu packen, erleichtert den Wechsel zu diesem Muster, da Sie den vorhandenen Code nicht neu schreiben müssen, damit er in das neue Modell passt.
Was sollte ich bei der Socket-Programmierung verwenden?
Ich würde empfehlen, den TAP zu verwenden, der die APM-Methoden auf Socket umschließt. Wenn Sie nicht beweisen können, dass der zusätzliche Overhead beim Einbetten der Begin / End-Methoden in eine Task der Unterschied zwischen skalierbar / schnell genug oder nicht ist, würde ich die einfache Programmierung des TAPs nutzen.
Gideon hatte eine großartige Antwort; Ich wollte nur etwas mehr Hintergrundwissen liefern:
Was sind die Vorteile von Asynchronous Programming Model (APM) und Event-based Asynchronous Pattern (EAP) im Vergleich zueinander?
APM ist häufiger und hat ein ziemlich genau definiertes Muster. Beispielsweise hat die TPL generische Wrapper für APM-Methoden ( TaskFactory.FromAsync
), aber sie kann nicht dasselbe für EAP tun, weil EAP nicht so genau definiert ist.
EAP hat einen großen Vorteil: Die Ereignisrückrufe behandeln das Thread-Marshalling für Sie. So sind sie zum Beispiel für grundlegende Hintergrundoperationen für eine Benutzeroberfläche ( BackgroundWorker
) wirklich nett.
TAP kombiniert das Beste aus beiden Welten: standardmäßig automatisches Thread-Marshalling und ein streng definiertes, gemeinsames Muster. Es hat auch eine schöne Objektdarstellung für eine asynchrone Operation ( Task
).
Wie kann "TPL APMs leicht verpacken" bedeuten, dass "sowohl APM als auch EAP durch TPL ersetzt werden"?
Tut es nicht.
"APM und EBAP werden jedoch durch einen viel flexibleren Ansatz ersetzt, der auf der Task Parallel Library basiert." - was bedeutet, dass neuer Code keine APM / EAP-Methoden / -Ereignisse enthalten muss; Neuer Code sollte stattdessen TAP-Methoden enthalten.
"Da die TPL APMs problemlos umbrechen kann, werden ältere Klassen wahrscheinlich nicht direkt aktualisiert. Erweiterungsmethoden werden verwendet, um Task-Äquivalente für die alten APM-Methoden bereitzustellen." - was bedeutet, dass Sie TAP-Methoden zu einem vorhandenen APM-Typ hinzufügen können, indem Sie TaskFactory.FromAsync
; Ich nahm an, dass das TPL-Team diesen Ansatz wählen würde, anstatt eine Menge Klassen in der BCL zu modifizieren. Allerdings lag ich in dieser Vermutung falsch. Aus Performance-Gründen hat das BCL / TPL-Team das gesamte Framework überprüft und TAP-Methoden direkt zu .NET-Klassen hinzugefügt, anstatt Erweiterungsmethoden zu verwenden. Die neuen TAP-Methoden sind in .NET 4.5 enthalten, demnächst ...
Tags und Links c# task-parallel-library sockets design-patterns asynchronous