Konferenz
17.03.2025, 10:25 Uhr
DWX hakt nach: Wie hält es Steven Giesel mit async/await?
Async/await vereinfacht unter .NET die Parallelverarbeitung. So die Theorie. Die Praxis erklärt Steven Giesel auf der Developer Week. Hier gibt er einen kurzen Einblick.
Steven Giesel, selbständiger Softwareentwickler, Microsoft MVP und Sprecher auf der DWX ist der Mann fürs Hard-Core-.NET-Programming: Er kümmert sich liebend gern um die kniffligen Dinge. Dazu zählt auch die asynchrone Programmierung mit async/await und wer damit schon programmiert hat, der weiß, dass diese Konstrukte ein Dauerabonnement zum „Hammer des Monats“ gepachtet haben. In seiner Session From Task.Run to Task.WhenAll: The Good, The Bad, and The Async wird er auf die Probleme mit der asynchronen Programmierung eingehen. Wir haben schon vorab Informationen aus ihm herausgekitzelt.
DWX: Steven, was sind die häufigsten Missverständnisse, die Entwickler bei async/await haben?
Steven Giesel: Entwickler setzen asynchron mit paralleler Verarbeitung gleich. Daher denken viele Entwickler das async ihnen Performancegewinne bescheren kann, was allerdings nur "ein schöner Seiteneffekt" ist. Viele Internetartikel und Videos beleuchten nur die Performance-Seite des Ganzen. Async und await bedeutet aber nicht zwangsweise, dass es einen zweiten Thread gibt. Der primäre Zweck von async und await ist die optimale Ausnutzung aller Ressourcen des Systems.
DWX: Wie kann die bewusste Nutzung von ConfigureAwait die Performance und Stabilität einer Anwendung beeinflussen?
Steven: ConfigureAwait hat nichts zwangsweise mit Performance zu tut - wobei ein Fünkchen Wahrheit dran ist. Es konfiguriert den Control-Flow einer asynchronen Operation. In vielen .NET-Anwendungen, die eine native UI besitzen (wie WPF oder Windows Forms), kann es allerdings dafür sorgen, dass keine sogenannte Dead-Locks entstehen. Hier zum Fünkchen Wahrheit: Der normale Control-Flow sorgt dafür, dass der Code zu demjenigen Kontext zurückkehrt (nicht zwangsweise Thread), welcher den Vorgang gestartet hat. Das kostet natürlich Zeit und wenn der Kontext gerade belegt ist, muss gewartet werden. In modernen Frameworks wie ASP.NET Core gibt es gar keinen Kontext und damit hat ConfigureAwait, bis auf sehr wenige Ausnahmen, keinen Einfluss auf den Code.
DWX: In welchen Szenarien ist ValueTask eine sinnvolle Alternative zu Task, und wann sollte man darauf verzichten?
Steven: ValueTask ist ein API-Contract, der angibt, dass ein Funktionsaufruf vollständig synchron ablaufen kann. Dies ist aus Leistungsgründen nützlich (weniger Zuweisungen und weniger CPU-Overhead), da es dem Aufrufer ermöglicht, den Overhead eines asynchronen Zustandsautomaten in dem üblichen Fall zu vermeiden, in dem die Funktion synchron abgeschlossen werden kann. Warum dann nicht immer ValueTask nutzen? Da ValueTask für High-Performance-Szenarien gedacht ist, gibt es viele Restriktionen, welche die Handhabung stärker einschränken (größeres Potential für Fehler) als Task.
Wer mehr wissen will, sollte auf die DWX Developer Week kommen und den Vortrag von Steven am 1. Juli 2025 um 16.00 Uhr hören. Mehr Informationen gibt es auf www.developer-week.de.