Fire and Forget and Awaiting in Async/Await: Unterschiede und Nutzungsszenarien
Der folgende Code zeigt die verschiedenen Möglichkeiten zum Aufrufen der Callee
-Methode und ihre Verhaltensunterschiede.
Ruf Nr. 1: Feuern und vergessen (einfach)
Callee
Die Methode wird asynchron aufgerufen und blockiert den Aufrufer nicht.
Anruf Nr. 2: Warten auf Aufgabe (Verzögerung)
Die MethodeCallee
verwendet das Schlüsselwort await
und der Aufrufer wartet, bis der Vorgang abgeschlossen ist. Da die Callee
-Methode eine Verzögerung von 1000 ms enthält, dauert es für den Aufrufer mehr als eine Sekunde.
Aufruf Nr. 3 und Nr. 5: Task.Run (Fire and Forget)
Task.Run
Sendet die Callee
-Methode zur Ausführung an den Thread-Pool. Da await
nicht verwendet wird, sind beide Anrufe „Fire“ und „Forget“ und blockieren den Anrufer nicht.
Aufruf Nr. 4 und Nr. 6: Task.Run (Aufgabe warten)
Ähnlich wie #3 und #5, aber Task.Run
verwendet await
intern. Dies entspricht Nr. 2: Der Aufrufer wartet, bis die Aufgabe abgeschlossen ist.
Der Unterschied zwischen #3 und #5
Während Nr. 3 und Nr. 5 beide Task.Run
verwenden, gibt es subtile Unterschiede. In #3 wird Callee
direkt aufgerufen, um eine neue Aufgabe im Thread-Pool zu erstellen. In #5 wird Callee
in einen asynchronen Lambda-Ausdruck eingeschlossen, der eine neue Aufgabe mit einer eigenen Zustandsmaschine erstellt. Da es sich bei beiden Missionen jedoch um „Fire and Forget“ handelt, ist der Unterschied in diesem Fall nicht signifikant.
Hinweise zu Service Fabric
Nach der Migration zu Service Fabric wird HostingEnvironment.QueueBackgroundWorkItem
nicht mehr unterstützt. Obwohl es möglich ist, Task.Run
als Alternative zu verwenden, ist es besser, einen separaten Hintergrundprozess zu verwenden und mit diesem über eine Warteschlange zu kommunizieren. Dies stellt die Isolierung zwischen Front-End- und Back-End-Diensten sicher und verhindert Leistungsprobleme oder Deadlocks.
Das obige ist der detaillierte Inhalt vonFire and Forget vs. Awaiting in Async/Await: Was ist der Unterschied und wann sollten Sie beide verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!