Asynchrone Programmierung wird in der modernen Softwareentwicklung häufig verwendet. Sie ermöglicht es, die Ausführung von langen Operationen, wie z. B. Netzwerkanfragen, zu optimieren, ohne das Programm zu blockieren. Die asynchrone Programmierung wurde in C# mit den Schlüsselwörtern async
und await
eingeführt. In diesem Fachartikel wird die asynchrone Programmierung mit Beispielen verdeutlicht und ihre Vor- und Nachteile beleuchtet.
Durch asynchrone Programmierung können bestimmte Aufgaben in einem Programm parallel ausgeführt werden, während auf die Fertigstellung anderer Aufgaben gewartet wird. Beispielsweise kann auf eine Antwort vom Server gewartet werden, während der Benutzer bereits Eingaben macht, die mit einem anderen Modul zusammenhängen. Das Ziel der asynchronen Programmierung ist es, die Reaktionszeiten von Anwendungen zu erhöhen und Störungen zu vermeiden.
async
-Schlüsselwort wird für Methoden verwendet und signalisiert, dass diese asynchrone Operationen enthalten. Eine asynchrone Methode kann mit Task
, Task<T>
oder void
als Rückgabewert definiert werden.await
-Operator wird verwendet, um auf einen Task oder ein Task<T>
-Objekt zu warten, ohne den Thread zu blockieren. Dadurch können von diesem Thread andere Aufgaben übernommen werden, solange auf die Fertigstellung der Aufgabe gewartet wird.
1public async Task<string> GetContentAsync(string url)
2{
3 using (var client = new HttpClient())
4 {
5 var response = await client.GetStringAsync(url);
6 return response;
7 }
8}
Unsere GetContentAsync()
-Methode ist mit async
deklariert und liefert einen Task<string>
als Ergebnis zurück. Durch den await
-Operator wird auf das Ergebnis von GetStringAsync()
gewartet.
1private static async Task<string> GetHelloWorldAsync()
2{
3 await Task.Delay(1000);
4 return "Hello, World!";
5}
Es ist ebenfalls möglich, mithilfe von Tasks einen Delay einzubauen. Dabei sollte nur beachtet werden, dass der Delay im Kontext sinnvoll eingesetzt wird und das Benutzererlebnis verbessert.
Das größte Problem bei async void
-Methoden ist die Fehlerbehandlung. Wenn eine Exception in einer async Task
-Methode geworfen wird, wird diese am Task-Objekt erfasst. Bei einer async void
-Methode gibt es jedoch kein Task-Objekt, weshalb die Ausnahme im SynchronizationContext ausgelöst wird. Diese Exception kann nicht mit try-catch
aufgefangen werden. Es wird empfohlen, async void
ausschließlich in Event-Handlern zu verwenden, da diese keinen Rückgabewert haben.
Asynchrone Programmierung in C# ermöglicht es, die Reaktionsfähigkeit und Leistung von Anwendungen zu verbessern. Durch den richtigen Einsatz können effiziente und robuste Anwendungen erstellt werden. Es ist jedoch wichtig, den asynchronen Ansatz sinnvoll im jeweiligen Kontext anzuwenden. Eine Kombination aus synchronen und asynchronen Ansätzen ist oft der effektivste Weg.