Asynchrone Programmierung in C#

Noel H. | Softwareentwickler
10/2024

Parallele Verarbeitung durch asynchrone Programmierung in C#

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.

Allgemeines zur asynchronen Programmierung

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.

Schlüsselwörter in C#

  • Async: Das 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: Der 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.

Implementierung einer asynchronen Methode

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.

Vorteile der asynchronen Programmierung

  • Effizientere Ressourcennutzung: Threads können für andere Aufgaben verwendet werden, was zu einer erhöhten Effizienz der Systemressourcen führt.
  • Skalierbarkeit: Anwendungen, die mit asynchroner Programmierung entwickelt werden, können mehr Anfragen mit derselben Hardware bearbeiten.
  • Benutzererlebnis: Durch asynchrone Programmierung erleben Benutzer weniger „Einfrieren“ von Anwendungen, da langwierige Aufgaben im Hintergrund verarbeitet werden.

Nachteile der asynchronen Programmierung

  • Komplexität: Asynchroner Code kann schwieriger zu verstehen sein als synchroner Code, insbesondere wenn er über mehrere Methoden oder Klassen verteilt ist.
  • Deadlocks: Die unbedachte Verwendung von asynchronen Methoden kann zu Deadlocks führen. Es sollte vermieden werden, dass ein UI-Thread auf das Ergebnis eines Tasks wartet, der wiederum auf eine UI-Operation wartet.
  • Overhead: Asynchrone Operationen können einen zusätzlichen Overhead erzeugen, da Verwaltungsaufwand entsteht. In Szenarien mit vielen schnellen Operationen kann der asynchrone Ansatz ineffizienter sein als der synchrone.

Vermeidung von „async void“

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.

Fazit

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.

GitHub-Beispiel

Noel H. | Softwareentwickler
Zurück zur Übersicht

Gemeinsam Großes schaffen

Wir freuen uns auf ein kostenloses Erstgespräch mit Ihnen!
Unser Geschäftsführer Tibor Csizmadia und unser Kundenbetreuer Jens Walter stehen Ihnen persönlich zur Verfügung. Profitieren Sie von unserer langjährigen Erfahrung und erhalten Sie eine kompetente Erstberatung in einem unverbindlichen Austausch.
Foto von Tibor

Tibor Csizmadia

Geschäftsführer
Foto von Jens

Jens Walter

Projektmanager
Devware GmbH verpflichtet sich, Ihre Privatsphäre zu schützen. Wir benötigen Ihre Kontaktinformationen, um Sie bezüglich unserer Produkte und Dienstleistungen zu kontaktieren. Mit Klick auf Absenden geben Sie sich damit einverstanden. Weitere Informationen finden Sie unter Datenschutz.
Vielen Dank für Ihre Nachricht!

Wir haben Ihre Anfrage erhalten und melden uns in Kürze bei Ihnen.

Falls Sie in der Zwischenzeit Fragen haben, können Sie uns jederzeit unter Kontaktanfrage@devware.de erreichen.

Wir freuen uns auf die Zusammenarbeit!
Oops! Something went wrong while submitting the form.
KontaktImpressumDatenschutz