Mir fehlt vielleicht etwas
Du bist.
Was ist der Unterschied zwischen tun Task.Wait
und await task
?
Sie bestellen Ihr Mittagessen beim Kellner im Restaurant. Einen Moment nach der Bestellung kommt ein Freund herein, setzt sich neben Sie und beginnt ein Gespräch. Jetzt haben Sie zwei Möglichkeiten. Sie können Ihren Freund ignorieren, bis die Aufgabe erledigt ist - Sie können warten, bis Ihre Suppe eintrifft, und nichts anderes tun, während Sie warten. Oder Sie können Ihrem Freund antworten, und wenn Ihr Freund aufhört zu reden, bringt Ihnen der Kellner Ihre Suppe.
Task.Wait
blockiert, bis die Aufgabe abgeschlossen ist - Sie ignorieren Ihren Freund, bis die Aufgabe abgeschlossen ist. await
Verarbeitet weiterhin Nachrichten in der Nachrichtenwarteschlange. Wenn die Aufgabe abgeschlossen ist, wird eine Nachricht in die Warteschlange gestellt, die besagt, dass Sie dort weitermachen, wo Sie nach dem Warten aufgehört haben. Sie sprechen mit Ihrem Freund, und wenn das Gespräch unterbrochen wird, kommt die Suppe an.
Task
, die 10 ms dauert, tatsächlich eine 10-stündige AusführungTask
in Ihrem Thread ausführen würde , wodurch Sie für die gesamten 10 Stunden blockiert würden?Um Erics Antwort hier zu demonstrieren, gibt es einen Code:
quelle
//If you press Button2 now you won't see anything in the console until this task is complete and then the label will be updated!
" ist irreführend. Beim Drücken der Schaltfläche mit dert.Wait();
Ereignisbehandlungsroutine für SchaltflächenklicksButtonClick()
ist es nicht möglich, etwas zu drücken und dann etwas in der Konsole anzuzeigen und die Beschriftung zu aktualisieren, "bis diese Aufgabe abgeschlossen ist", da die GUI eingefroren ist und nicht mehr reagiert, dh Klicks oder Interaktionen mit der GUI werden LOST bis zum Abschluss der Task - Wartet.Wait
wird den Haupt-Thread blockieren, bis die Aufgabe abgeschlossen ist."Dieses Beispiel zeigt den Unterschied sehr deutlich. Mit async / await blockiert der aufrufende Thread nicht und wird weiter ausgeführt.
DoAsTask-Ausgabe:
DoAsAsync-Ausgabe:
Update: Verbessertes Beispiel durch Anzeigen der Thread-ID in der Ausgabe.
quelle
Wait () führt dazu, dass möglicherweise asynchroner Code synchron ausgeführt wird. Warten wird nicht.
Sie haben beispielsweise eine asp.net-Webanwendung. UserA ruft den Endpunkt / getUser / 1 auf. Der asp.net-App-Pool wählt einen Thread aus dem Thread-Pool (Thread1) aus und dieser Thread führt einen http-Aufruf durch. Wenn Sie Wait () ausführen, wird dieser Thread blockiert, bis der http-Aufruf aufgelöst wird. Wenn UserB / getUser / 2 aufruft, muss der App-Pool während des Wartens einen anderen Thread (Thread2) bereitstellen, um erneut einen http-Aufruf durchzuführen. Sie haben gerade einen anderen Thread ohne Grund erstellt (tatsächlich aus dem App-Pool abgerufen), da Sie Thread1 nicht verwenden können. Er wurde von Wait () blockiert.
Wenn Sie "Warten" für Thread1 verwenden, verwaltet SyncContext die Synchronisierung zwischen Thread1 und http-Aufruf. Es wird einfach benachrichtigt, sobald der http-Aufruf abgeschlossen ist. Wenn UserB / getUser / 2 aufruft, verwenden Sie Thread1 erneut, um einen http-Aufruf zu tätigen, da er veröffentlicht wurde, sobald er auf einen Treffer wartet. Dann kann eine andere Anfrage es noch weiter nutzen. Sobald der http-Aufruf abgeschlossen ist (Benutzer1 oder Benutzer2), kann Thread1 das Ergebnis abrufen und zum Anrufer (Client) zurückkehren. Thread1 wurde für mehrere Aufgaben verwendet.
quelle
In diesem Beispiel praktisch nicht viel. Wenn Sie auf eine Aufgabe warten, die für einen anderen Thread zurückgegeben wird (z. B. einen WCF-Aufruf) oder die Steuerung an das Betriebssystem abgibt (z. B. Datei-E / A), verbraucht wait weniger Systemressourcen, indem ein Thread nicht blockiert wird.
quelle
Im obigen Beispiel können Sie "TaskCreationOptions.HideScheduler" verwenden und die "DoAsTask" -Methode stark ändern. Die Methode selbst ist nicht asynchron, wie es bei "DoAsAsync" der Fall ist, da sie einen "Task" -Wert zurückgibt und als "async" markiert ist, wobei mehrere Kombinationen vorgenommen werden. Auf diese Weise erhalte ich genau das gleiche wie bei der Verwendung von "async / await". ::
quelle