Kontrollflussmechanismus von yield
und await
in .NET
Ihr Verständnis der Schlüsselwörter yield
und await
in .NET ist im Allgemeinen richtig. yield
Ermöglicht dem Iteratorblock, die Kontrolle an den aufrufenden Code zurückzugeben und die Ausführung dort fortzusetzen, wo sie aufgehört hat, wenn der Iterator erneut aufgerufen wird. await
Wartet nicht nur darauf, dass der Angerufene fertig ist, sondern gibt auch die Kontrolle an den Anrufer zurück. Wenn der Aufrufer die Methode erneut await
ausführt, wird die Ausführung dort fortgesetzt, wo sie aufgehört hat.
Der Schlüssel zum Verständnis dieser Strukturen liegt in ihren Umsetzungsmechanismen. Für await
entspricht es im Wesentlichen einer „Rendite auf hohem Niveau“. Wenn ein await
-Ausdruck auftritt, prüft die Laufzeit, ob die Aufgabe abgeschlossen wurde. Wenn der Vorgang nicht abgeschlossen ist, weist er einen Delegaten zu, führt den Rest der Methode als Fortsetzung der Aufgabe aus und gibt ihn an den Aufrufer zurück. Wenn die Aufgabe abgeschlossen ist, wird der Rest der Methode sofort ausgeführt.
await
enthält eine Zahl, die den nächsten auszuführenden Befehlszeiger in einer Nachschlagetabelle identifiziert. Dadurch wird sichergestellt, dass die Aufgabe beim Fortsetzen an der richtigen Stelle weiter ausgeführt wird. Fortsetzungen speichern auch die Werte aller lokalen und temporären Variablen, sodass eine Methode die Ausführung fortsetzen kann, als wäre sie nie unterbrochen worden.
Auf die Frage, wie die Laufzeit mehrere Methodenaufrufe vor await
verarbeitet, lautet die Antwort, dass der Aktivierungsdatensatz des Aufrufers und der Aktivierungsdatensatz der von ihm aufgerufenen Methode nicht im selben Stapel gespeichert sind. Stattdessen werden await
die für die Wiederherstellung relevanten Informationen auf dem Heap gespeichert. Dadurch wird sichergestellt, dass der Stack nicht durch nachfolgende Methodenaufrufe überschrieben wird.
Wenn eine nicht behandelte Ausnahme auftritt, wird diese abgefangen und in der Aufgabe gespeichert. Diese Ausnahme wird erneut ausgelöst, wenn die Ergebnisse der Aufgabe vorliegen. Dieses Verhalten stellt sicher, dass Ausnahmen auch bei asynchronen Vorgängen korrekt behandelt werden.
Ein ähnliches Prinzip gilt für die Umsetzung von yield
. Wenn der Iterator yield
einen Wert blockiert, wird der Status der lokalen Variablen auf den Heap kopiert, zusammen mit einer Zahl, die die MoveNext
-Anweisung angibt, die beim nächsten Aufruf des Iterators mit der Ausführung fortfahren soll. Dadurch kann der Iterator die Ausführung am Punkt yield
anhalten und die Ausführung später fortsetzen, ohne einen Status zu verlieren.
Durch die Nutzung dieser komplexen Mechanismen bieten die Schlüsselwörter yield
und await
eine leistungsstarke Möglichkeit, asynchrone und iterative Vorgänge in .NET zu implementieren. Sie ermöglichen die Simulation der Parallelität ohne die Notwendigkeit von Threads, wodurch der Code vereinfacht und die Leistung verbessert wird.
Das obige ist der detaillierte Inhalt vonWie verwalten „Yield' und „Await' den Kontrollfluss in .NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!