Zwei neue Schlüsselwörter, die der C# 5.0-Sprache hinzugefügt wurden, sind async und warten darauf, dass beide Hand in Hand eine C# -Methode asynchron ausführen, ohne den aufrufenden Thread zu blockieren.
, die über den Zweck wird der Funktion, aber es gibt zu viel „Kredit“ zu der Asynchron/await Funktion.
Lassen Sie mich in diesem Punkt sehr, sehr klar sein: await
verursacht nicht magisch eine synchrone Methode, um asynchron zu laufen. Es wird kein neuer Thread gestartet und die Methode zum Beispiel für den neuen Thread ausgeführt. Die Methode, die Sie aufrufen, muss die Sache sein, die sich selbst asynchron ausführen kann. Wie es sich dazu entscheidet, ist sein Geschäft.
Meine Frage ist, nutzen diese Methoden tatsächlich mehrere Kerne und laufen parallel oder läuft die Async-Methode im selben Thread-Kern wie der Aufrufer?
Nochmals, das ist ganz bis zu der Methode, die Sie anrufen. All das, was await
tut, weist den Compiler an, die Methode in einen Delegaten neu zu schreiben, der als Fortsetzung der asynchronen Task übergeben werden kann. Das heißt, die await FooAsync()
bedeutet „FooAsync()
nennen und was auch immer kommt wieder etwas sein muss, die die asynchrone Operation darstellt, die gerade in Betrieb genommen. Das Ding Sagen Sie, dass, wenn es weiß, dass die asynchrone Operation durchgeführt wird, soll es diese Delegierten nennen.“ Der Delegat verfügt über die Eigenschaft, dass die aktuelle Methode nach dem Aufruf scheinbar "dort fortgesetzt wird, wo sie aufgehört hat".
Wenn die Methode Sie Pläne rufen auf einem anderen Thread arbeiten affinitize an einen anderen Kern, groß. Wenn es einen Timer startet, der in der Zukunft auf dem UI-Thread einige Ereignishandler pingt, großartig. await
ist es egal. Alles was es tut, ist sicherzustellen, dass die Steuerung, wenn der asynchrone Job beendet ist, dort weiterarbeiten kann, wo sie aufgehört hat.
Eine Frage, die Sie nicht gefragt hat, aber wahrscheinlich haben sollte, ist:
Wenn die asynchrone Aufgabe beendet ist und die Steuerung nimmt, wo er aufgehört hat, ist die Ausführung im selben Thread wie es vorher war?
Es hängt vom Kontext ab. In einer Winforms-Anwendung, in der Sie etwas vom UI-Thread abwarten, wird die Steuerung im UI-Thread erneut gestartet. In einer Konsolenanwendung, vielleicht nicht.
Es hängt von dem erwarteten Objekt ab, das von der asynchronen Methode zurückgegeben wird. – phoog
Weder. Sie sind nur Syntaxzucker. Threading hängt von dem aktuellen 'SynchronizationContext' und der' Task' ab, die Sie erwarten. – CodesInChaos