39 Stimmen

Wie funktioniert das Async-Feature von F# wirklich?

Ich versuche zu lernen, wie async und let! in F# funktionieren. Alle Dokumentationen, die ich gelesen habe, erscheinen verwirrend. Was ist der Sinn, einen async-Block mit Async.RunSynchronously auszuführen? Ist das async oder synchron? Sieht nach einem Widerspruch aus.

Die Dokumentation sagt, dass Async.StartImmediate im aktuellen Thread läuft. Wenn es im selben Thread läuft, sieht es für mich nicht sehr asynchron aus... Oder vielleicht sind Asyncs mehr wie Koroutinen als Threads. Wenn ja, wann geben sie zurück und fort?

Zitiere MS-Dokumentation:

Die Zeile des Codes, die let! verwendet, startet die Berechnung und dann wird der Thread ausgesetzt bis das Ergebnis verfügbar ist, wobei die Ausführung fortgesetzt wird.

Wenn der Thread auf das Ergebnis wartet, warum sollte ich es verwenden? Sieht aus wie ein einfacher Funktionsaufruf.

Und was macht Async.Parallel? Es empfängt eine Sequenz von Async<'T>. Warum nicht eine Sequenz von einfachen Funktionen, die parallel ausgeführt werden sollen?

Ich glaube, hier fehlt mir etwas sehr Grundlegendes. Ich denke, nachdem ich das verstanden habe, wird die gesamte Dokumentation und die Beispiele sinnvoll werden.

0voto

James Black Punkte 41034

In einem async-Block können Sie sowohl synchrone als auch asynchrone Operationen haben. Zum Beispiel kann eine Website den Benutzerstatus auf mehrere Arten anzeigen, z. B. ob Rechnungen bald fällig sind, Geburtstage anstehen und Hausaufgaben fällig sind. Nichts davon befindet sich in der gleichen Datenbank, daher wird Ihre Anwendung drei separate Aufrufe tätigen. Möglicherweise möchten Sie die Anrufe parallel durchführen, sodass, wenn der langsamste abgeschlossen ist, die Ergebnisse zusammengeführt und angezeigt werden können. Das Endergebnis basiert auf dem Langsamsten. Sie kümmern sich nicht um die Reihenfolge, in der diese zurückkommen, sondern möchten nur wissen, wann alle drei erhalten wurden.

Um mein Beispiel abzuschließen, möchten Sie möglicherweise synchron die Arbeit erledigen, um die Benutzeroberfläche zur Anzeige dieser Informationen zu erstellen. Am Ende möchten Sie also diese Daten abrufen und die Benutzeroberfläche anzeigen. Teile, bei denen die Reihenfolge unwichtig ist, werden parallel ausgeführt, und Teile, bei denen die Reihenfolge wichtig ist, können synchron durchgeführt werden.

Sie können dies als drei Threads ausführen, aber dann müssen Sie den Ursprungsthread verfolgen und ihn wieder fortsetzen, wenn der dritte fertig ist. Es ist jedoch einfacher, wenn das .NET Framework sich darum kümmert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X