Die .NET 4.5-Framework-Bibliotheken integrieren C # -Arbeitsbasiertes Async ziemlich umfassend. In vielen Fällen geben sie weiterhin APM-ähnliche Begin / End-Methodenpaare frei. F # kann beide Methoden problemlos an asynchrone F # -Synchrone Berechnungen anpassen.
Meine Frage ist, gibt es bei einer IO-gebundenen Operation, die im Framework als Anfangs- / Ende- und aufgabenbasiertes Async implementiert ist, einen Leistungs- oder Speichervorteil, wenn Sie bei der Anpassung an F # async einen anderen auswählen?
In .NET 4.5 hat System.IO.Stream
sowohl BeginRead und ReadAsync . Das bedeutet, dass ich das tun kann ...
Oder ich kann das tun ...
%Vor%Gibt es irgendeinen Grund, einen vor dem anderen zu bevorzugen? Der Hauptunterschied, den ich mir vorstellen kann, ist, dass die Leseoperation bereits gestartet wurde, wenn die zweite Erweiterungsmethode zurückkehrt, aber nicht mit der ersten Erweiterungsmethode.
Eine AsyncRead
Erweiterungsmethode ( implementiert in FromBeginEnd
) ist bereits in FSharp.Core definiert. AwaitTask
ist nur ein dünner Wrapper über Task.ContinueWith
. Es läuft also auf einen Vergleich von Task
und async
hinaus - was effizienter ist, oder richtig für den Job. Da Sie mit async
s arbeiten, wäre der einzige relevante Unterschied die Leistung. Ich bin kein Experte in diesem Thema, aber ich denke, dass async
und Task
das gleiche Problem behandeln, wobei Task
eine Kante für CPU-gebundene Operationen hat.
Ich habe deine Frage nicht sorgfältig genug gelesen. Ich kenne die definitive Antwort nicht, aber da Task
und async
ungefähr gleich sind, sehe ich keinen Grund, ein Task
mit einem async
zu umbrechen, es sei denn, es ist deine einzige Option. Begin/End
Methoden sind eine untergeordnete, leichtere Abstraktion und erscheinen daher als bessere Bausteine für async
s.
Ein zusätzlicher Gedanke: Die Tatsache, dass AsyncRead
nicht geändert wurde, um Task
zu verwenden, könnte aufschlussreich sein.