Wie verstehe ich asynchronen Code?

Hallo Habr! Ich präsentiere Ihnen die Übersetzung (mit geringfügigen Korrekturen) des Artikels "Wie denke ich über Async-Code ?!" von Leslie Richardson.



Asynchroner Code wird für das Schreiben reaktionsfähiger Anwendungen immer beliebter. Leider bringt die asynchrone Programmierung auch zusätzliche Schwierigkeiten mit sich. Infolgedessen kann das Verständnis der Funktionsweise eines solchen Codes unabhängig von Ihrer Erfahrung eine entmutigende Aufgabe sein. Wenn Sie gerade erst mit asynchronem Code beginnen oder Ihr Verständnis auffrischen möchten, ist dies eine Einführung in die Welt der asynchronen Programmierung!



Was ist asynchroner Code?



Mit der asynchronen Programmierung können Sie einen Codeblock ausführen, ohne den gesamten Thread anzuhalten (oder zu blockieren), in dem die Aktion ausgeführt wird. Ein verbreiteter Mythos über asynchronen Code ist, dass er die Leistung verbessert, was nicht immer der Fall ist. Stattdessen besteht das Hauptmerkmal der asynchronen Programmierung darin, dass die Anzahl der Aufgaben (Durchsatz) erhöht wird, die gleichzeitig ausgeführt werden können, ohne dass der Thread blockiert werden muss, in dem diese Aktionen ausgeführt werden.



Sie könnten denken, dass asynchroner Code dem Multithread-Code sehr ähnlich ist, schließlich können in beiden Fällen viele Methoden gleichzeitig ausgeführt werden. Tatsächlich kann die asynchrone Programmierung sowohl mit Single-Thread- als auch mit Multi-Thread-Anwendungen verwendet werden. Dies bedeutet, dass Sie ein asynchrones Single-Thread-Programm haben können, in dem ein Thread parallele Aufgaben ausführen kann. Umgekehrt können Sie auch eine asynchrone Multithread-Anwendung verwenden, in der mehrere Threads mehrere parallele Aufgaben ausführen können.



Warum sollte ich asynchronen Code verwenden? Beispiel bitte!



Betrachten Sie den Prozess des Backens eines Kuchens, um eine Analogie zur Demonstration der asynchronen Programmierung zu erhalten. Dieser Prozess wird durch einen Thread dargestellt, der mehrere Schritte (oder Aufgaben) ausführt, wie im folgenden Code gezeigt. Dieser Code ist korrekt und Sie erhalten nach Ausführung der Methode immer noch einen köstlichen Kuchen. Da jedoch der gesamte Code synchron ist, wird jede Zeile nacheinander ausgeführt. Mit anderen Worten, Sie stehen völlig still, während Sie darauf warten, dass der Ofen fertig ist. Aber gleichzeitig könnten Sie Teig für Ihren Kuchen machen!



Synchrone MakeCake () -Methode



Bild



Synchrones Kuchenbackprogramm



Bild



Im wirklichen Leben neigen Sie dazu, diesen Prozess in Aufgaben zu unterteilen und den Teig zu kneten, während der Ofen aufheizt. Oder machen Sie das Sahnehäubchen, während der Kuchen im Ofen gebacken wird. Dies erhöht Ihre Produktivität und ermöglicht es Ihnen, den Kuchen viel schneller zu backen. Hier bietet sich asynchroner Code an! Indem wir unseren aktuellen Code asynchron machen, können wir andere Dinge tun, um die Zeit zu vertreiben, während wir auf das Ergebnis einer Aufgabe warten , z. B. das Backen eines Kuchens im Ofen.

Dazu ändern wir unseren Code und fügen die PassTheTime- Methode hinzu . Jetzt speichert unser Code den Status der Aufgabe, startet eine weitere synchrone oder asynchrone Operation und ruft bei Bedarf das Ergebnis der gespeicherten Aufgabe ab.



Asynchrones MakeCake ()

Bild



Asynchrones Kuchenbackprogramm

Bild



Im Vergleich zur synchronen MakeCake- Methode , bei der die PassTheTime- Methode fehlt , kann die asynchrone MakeCakeAsync- Methode mehr Aufgaben ausführen, ohne den Thread zu blockieren, wodurch sich die Zeit für die gesamte Methode verringert.



Vergleich von asynchronen und synchronen Programmen



Bild



Wie schreibe ich asynchronen Code in .NET?



Mit C # können Sie asynchronen Code mit dem Aufgabentyp und den Schlüsselwörtern await und async schreiben . Der Aufgabentyp informiert den Anrufer über einen möglichen Rückgabetyp. Es zeigt auch an, dass andere Aktionen in der aufrufenden Methode weiterhin ausgeführt werden können. Das Schlüsselwort async wird mit dem Schlüsselwort await gepaart , das den Compiler benachrichtigt, dass wir einen Rückgabewert von der Methode benötigen, jedoch nicht sofort. Infolgedessen müssen wir den aufrufenden Thread nicht blockieren und können weitere Aufgaben ausführen, bis der erwartete Wert erforderlich ist. Die asynchrone Methode wird zunächst synchron ausgeführt, bis das Schlüsselwort await gefunden wurde... Dies ist genau der Moment, in dem die Ausführung der Methode asynchron beginnt.



Ich habe etwas über asynchronen Code gelernt! Was jetzt?



Während eine asynchrone Kuchenbackanwendung großartig ist, gibt es viele andere reale Anwendungen, die ebenfalls asynchronen Code verwenden. Die beiden häufigsten Beispiele sind:



Anwendungen, die HTTP-Anforderungen verwenden - Je nach Anforderung kann die Verarbeitung von HTTP-Aufrufen lange dauern. Durch die Verwendung von asynchronem Code können wir andere Vorgänge ausführen, während wir auf eine Antwort vom Server warten.



Beispiel für eine HTTP-GET-Anforderung



Bild



UI-Anwendungen - WPF-Anwendungen oder andere Anwendungen, die Schaltflächen, Textfelder und andere UX-Ressourcen verwenden, eignen sich auch hervorragend für die asynchrone Implementierung. Zum Beispiel eine WPF-Anwendung, die eine Datei analysiert. Dieser Vorgang kann einige Zeit dauern. Wenn Sie diese Aktion jedoch asynchron machen, können Sie dennoch mit der Benutzeroberfläche interagieren, ohne die Anwendung vollständig anzuhalten, während Sie auf den Abschluss des Vorgangs warten.



All Articles