Erste Schritte mit asynchroner Programmierung
Entwickler verwenden asynchrone Programmiertechniken, um Leistungsengpässe zu vermeiden und die Gesamtreaktionsfähigkeit ihrer Anwendungen zu verbessern. Herkömmliche Techniken zum Schreiben asynchroner Anwendungen können jedoch kompliziert sein, wodurch sie schwer zu schreiben, zu debuggen und zu verwalten sind.
C# unterstützt einen vereinfachten asynchronen Programmieransatz, der asynchrone Unterstützung in der .NET-Laufzeit nutzt. Der Compiler erledigt die schwierige Arbeit, die der Entwickler verwendet hat, und Ihre Anwendung behält eine logische Struktur bei, die dem synchronen Code ähnelt. Daher erhalten Sie alle Vorteile der asynchronen Programmierung mit einem Bruchteil des Aufwands.
Indem Sie verstehen, wie asynchrone Prozesse in der realen Welt funktionieren, können Sie lernen, wie Sie die asynchrone Programmierung in Ihren Anwendungen verwenden.
Untersuchen eines asynchronen Prozesses in der realen Welt
Das Frühstück ist ein gutes Beispiel für einen Prozess, der von der asynchronen Ausführung von Aufgaben profitiert. Sie können sich das Frühstück als eine Reihe von Aufgaben vorstellen, die synchron oder asynchron ausgeführt werden können.
- Holen Sie sich die Frühstückszutaten aus der Pantry.
- Gießen Sie eine Tasse Kaffee ein.
- Wärmen Sie eine Pfanne, und braten Sie dann drei Scheiben Bacon.
- Braten Sie zwei Eier.
- Toasten Sie zwei Stücke Brot.
- Bestreichen Sie den Toast mit Butter und Marmelade.
- Gießen Sie ein Glas Orangensaft.
Wenn Sie Erfahrung mit dem Kochen haben, können Sie diese Anweisungen asynchron ausführen. Sie beginnen die Pfannenerwärmung für den Bacon und Eier und holen dann die Zutaten aus der Pantry. Sie legen das Brot in den Toaster und beginnen dann mit dem Kochen der Bacon. Bei jedem Schritt des Prozesses starten Sie eine Aufgabe und wechseln dann zu anderen Aufgaben, die für Ihre Aufmerksamkeit bereit sind.
Kochfrühstück ist ein gutes Beispiel für asynchrone Arbeit, die nicht parallel ist. Eine Person (oder ein Thread) kann alle Aufgaben verarbeiten. Eine Person kann frühstücken, indem sie die nächste Aufgabe asynchron starten, bevor die vorherige Aufgabe abgeschlossen ist. Jede Kochaufgabe verläuft unabhängig davon, ob jemand aktiv den Prozess überwacht. Sobald Sie mit der Erwärmung der Pfanne beginnen, können Sie Zutaten aus der Pantry erhalten. Nachdem der Bacon zu kochen beginnt, können Sie das Brot in den Toaster legen.
Für einen parallelen Algorithmus benötigen Sie mehrere Personen, die kochen (oder mehrere Threads). Eine Person kocht die Eier, eine andere brät den Speck, und so weiter. Jede Person konzentriert sich auf ihre spezifische Aufgabe. Jede Person, die kocht (oder jeder Thread) wird synchron blockiert, bis die aktuelle Aufgabe abgeschlossen ist: Speck ist bereit zum Wenden, Brot ist bereit, aus dem Toaster zu springen, und so weiter.
Mithilfe von asynchronen Programmiertechniken können Sie die Effizienz und Reaktionsfähigkeit Ihrer Anwendung verbessern, genau wie sie das Frühstück effizienter gestalten können, indem Sie mehrere Aufgaben gleichzeitig ausführen.
Async verbessert die Reaktionsfähigkeit
Asynchronie ist wichtig für Aktivitäten, die potenziell blockiert werden, z. B. Webzugriff. Der Zugriff auf eine Webressource ist manchmal langsam oder verzögert. Wenn eine solche Aktivität in einem synchronen Prozess blockiert wird, muss die gesamte Anwendung warten. In einem asynchronen Prozess kann die Anwendung mit anderen Arbeiten fortfahren, die nicht von der Webressource abhängig sind, bis der potenziell blockierende Vorgang abgeschlossen ist.
Die folgende Tabelle zeigt typische Bereiche, in denen die asynchrone Programmierung die Reaktionsfähigkeit verbessert. Die aufgeführten APIs von .NET und die Windows-Runtime enthalten Methoden, die die asynchrone Programmierung unterstützen.
| Anwendungsbereich | .NET-Typen mit Async-Methoden | Windows-Runtime-Typen mit Async-Methoden |
|---|---|---|
| Webzugriff | HttpClient | Windows.Web.Http.HttpClient, SyndicationClient |
| Arbeiten mit Dateien | JsonSerializer, StreamReader, StreamWriter usw. | StorageFile |
| Arbeiten mit Bildern | MediaCapture, BitmapEncoder, BitmapDecoder | |
| WCF-Programmierung | Synchrone und asynchrone Vorgänge |
So erstellen und aufrufen Sie asynchrone Methoden
In C# wurden asynchrone Vorgänge mit den Schlüsselwörtern async und await implementiert. Das async Schlüsselwort wird verwendet, um eine asynchrone Methode zu definieren, während das await Schlüsselwort verwendet wird, um eine asynchrone Methode aufzurufen und auf das Ergebnis zu warten, ohne den aufrufenden Thread zu blockieren. Die asynchronen Vorgänge werden in der Regel mithilfe der Typen Task oder Task<T> implementiert, die einen laufenden Vorgang darstellen, der erwartet werden kann.
Hier ist ein Beispiel für das Erstellen und Aufrufen einer asynchronen Aufgabe in C#:
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
string filePath = "example.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}
public static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
string content = await reader.ReadToEndAsync();
return content;
}
}
}
In diesem Beispiel wird die ReadFileAsync Methode mithilfe des async Schlüsselworts definiert und hat einen Rückgabetyp von Task<string>. Das async Schlüsselwort gibt an, dass die Methode asynchrone Vorgänge enthält, und der Rückgabetyp gibt Task<string> an, dass die Methode eine Aufgabe zurückgibt, die den asynchronen Vorgang darstellt. Der Task<string> Typ ist eine generische Aufgabe, die einen asynchronen Vorgang darstellt, der einen Zeichenfolgenwert zurückgibt. Die ReadFileAsync Methode verwendet einen Dateipfad als Parameter und liest den Inhalt der Datei asynchron.
Die Main Methode wird auch als asynchron definiert, sodass sie die ReadFileAsync Methode mithilfe des await Schlüsselworts aufrufen kann. Das await Schlüsselwort wird verwendet, um anzugeben, dass das Programm auf das Ergebnis des asynchronen Vorgangs warten soll, bevor er fortgesetzt wird. In diesem Fall wartet das Programm, bis die Datei vor dem Drucken des Inhalts in die Konsole gelesen wird.
Zusammenfassung
In dieser Lektion haben Sie die Vorteile der asynchronen Programmierung kennengelernt und erfahren, wie sie die Reaktionsfähigkeit Ihrer Anwendungen verbessern kann. Außerdem haben Sie erfahren, wie Sie asynchrone Methoden mithilfe des async und await Schlüsselworts in C# erstellen und aufrufen. Mithilfe dieser Techniken können Sie effizientere und reaktionsfähige Anwendungen schreiben, die potenziell blockierende Vorgänge verarbeiten können, ohne die Benutzeroberfläche einzufrieren oder andere Aufgaben zu blockieren.
Wichtige Punkte
- Die asynchrone Programmierung verbessert die Leistung und Reaktionsfähigkeit der Anwendung.
- C# bietet einen vereinfachten Ansatz für die asynchrone Programmierung.
- Die asynchrone Programmierung ist von Vorteil bei der potenziellen Blockierung von Aktivitäten wie dem Webzugriff.
- In C# werden asynchrone Methoden mithilfe des
asyncSchlüsselworts erstellt und mithilfe desawaitSchlüsselworts aufgerufen. - Die
Task- oderTask<T>-Typen repräsentieren laufende Operationen, die in C# abgewartet werden können.