Thread-Verhalten nach dem Schlüsselwort „await“ verstehen
Bei der asynchronen Programmierung spielt das Schlüsselwort „await“ eine entscheidende Rolle bei der Verwaltung von Threads und der Gewährleistung einer effizienten Ausführung. Allerdings kann es verwirrend sein, zu verstehen, wie der Code nach der Begegnung mit „await“ weitergeht. Ziel dieses Artikels ist es, dies durch eine detaillierte Untersuchung zu verdeutlichen.
Betrachten Sie den folgenden Codeausschnitt als Beispiel:
private async Task MyAsyncMethod() { // Code before await await MyOtherAsyncMethod(); // Code after await } private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); }
Wenn das Schlüsselwort „await“ in MyAsyncMethod angetroffen wird, wird die Kontrolle an MyMethod zurückgegeben. Dies liegt daran, dass MyAsyncMethod als asynchron markiert ist. Da dann jedoch task.Wait() aufgerufen wird, wird der Thread, der MyMethod ausführt, blockiert, was scheinbar die Ausführung des Codes nach dem Warten verhindert.
Führt ein neuer Thread den Code nach dem Warten aus?
Die Antwort ist: vielleicht. Das Verhalten hängt von der Implementierung des Synchronisierungskontexts ab, der zum Zeitpunkt der Auswertung des Warteausdrucks „aktuell“ ist.
Wenn im bereitgestellten Beispiel der Code in einem UI-Thread ausgeführt wird, wird die Fortsetzung (der Code nach dem Warten) wird im selben UI-Thread ausgeführt. Wenn der Code hingegen auf einem Thread-Pool-Thread ausgeführt wird, kann die Fortsetzung auf jedem verfügbaren Thread-Pool-Thread ausgeführt werden.
Thread-Blockade vermeiden
Wenn das Ziel darin besteht, den Code nach dem Warten sofort auszuführen, ist es wichtig, das Blockieren des Threads mit task.Wait() oder task.Result zu vermeiden. Erwägen Sie stattdessen andere Optionen wie das Registrieren eines Rückrufs oder die Verwendung der Warteaufgabe selbst.
Thread-Affinität steuern
Für Szenarien, in denen eine bestimmte Thread-Affinität für die Fortsetzung erforderlich ist, wird die Die Methode „ConfigureAwait“ kann verwendet werden. Durch die Übergabe von „false“ an „ConfigureAwait“ kann die Fortsetzung explizit angewiesen werden, in einem anderen Thread-Kontext ausgeführt zu werden.
Zusätzliche Ressourcen
Um Ihr Verständnis des Thread-Verhaltens mit „await“ zu vertiefen, Weitere Informationen finden Sie in den folgenden Ressourcen:
Das obige ist der detaillierte Inhalt vonWas passiert mit dem Thread nach einem „await'-Schlüsselwort in der asynchronen C#-Programmierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!