In einer Multithread-Anwendung ist das Verständnis des Ausführungsflusses von entscheidender Bedeutung. Wenn Entwickler auf das rätselhafte Schlüsselwort „await“ stoßen, kämpfen sie oft mit der Frage: „Welcher Thread orchestriert die Wiederaufnahme des Codes nach dem „await“?“
Bedenken Sie den folgenden Codeausschnitt:
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
Angenommen, dieser Code läuft in einer Single-Thread-Anwendung, wird es verwirrend: Wie kann der Code nach dem Schlüsselwort „await“ ausgeführt werden, wenn der Thread vorhanden ist? gesperrt durch 'task.Wait()'?
Die Antwort liegt im raffinierten Verhalten des Schlüsselworts 'await'. Dadurch wird die Kontrolle an den Aufrufer zurückgegeben, sodass andere asynchrone Vorgänge fortgesetzt werden können. Die Fortsetzung der „Warten“-Aufgabe (der Code nach „Warten“) ist so geplant, dass sie in einem Thread ausgeführt wird, der dem aktuellen Synchronisierungskontext entspricht.
In diesem Szenario wird die Funktion „MyMethod()“ verwendet auf einem UI-Thread ausgeführt wird, würde der Code nach dem „await“ auch auf dem UI-Thread ausgeführt, sobald „MyOtherAsyncMethod()“ abgeschlossen ist.
Allerdings Es ist wichtig zu beachten, dass der genaue Thread, der für die Fortsetzung verwendet wird, nicht garantiert wird. In Multithread-Anwendungen kann die Fortsetzung auf jedem verfügbaren Thread aus dem Thread-Pool ausgeführt werden. Der Synchronisationskontext stellt jedoch sicher, dass der Code nach dem „await“ in konsistenter Weise in Bezug auf den ursprünglichen Thread ausgeführt wird.
Im gegebenen Beispiel wird durch den Aufruf von „task.Wait()“ der main Der Thread wird auf unbestimmte Zeit blockiert, wodurch verhindert wird, dass die Fortsetzung jemals ausgeführt wird. Um dies zu vermeiden, sollten asynchrone Vorgänge ordnungsgemäß abgewartet werden, ohne den Hauptthread zu blockieren.
Das obige ist der detaillierte Inhalt vonWelcher Thread führt Code nach einem „await'-Schlüsselwort in einer Multithread-Anwendung aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!