Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C# 7: Neue Funktionen

Flexibles Await

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Bislang musste eine Methode, die zu einem späteren Zeitpunkt ein Ergebnis liefert, einen Task zurückgeben. Await war nur bei Tasks möglich. C# 7.0 schlägt nun mit ValueTask einen flexibleren Weg ein. Erfahren Sie in diesem Video mehr darüber.
06:45

Transkript

Bisher musste eine Methode, die zu einem späteren Zeitpunkt ein Ergebis liefert, einen Task zurückliefern. Await war nur bei Tasks möglich. Mit C# 7 wird das flexibler. Wir können auf ein Objekt warten, das die Methode GetAwaiter anbietet. Im Framework gibt es dafür auch den Value Task Typ, der diese Methode implementiert. Was das bedeutet, sehen Sie hier. In diesem Beispiel implementiere ich diese FlexibleAwait Methode. Dahin rufe ich die Methode private static Task ReturnsANumber auf. Wenn wir bisher keinen parallelen Task erzeugen mussten, sondern gleich ein Ergebnis geliefert haben, konnten wir von der Task Klasse "FromResult" verwenden. Und ich liefere gleich den Wert 42 zurück. Nachdem wir auf Task warten können, mache ich ein await ReturnsANumber() und schreibe das Ergebnis in einen Integer. Await benötigt einen asynchronen Scope, "Make method async" und wir haben hier einen asynchronen Scope. Write.Line(result) Starten wir das Programm. Und wir haben, wie erwartet, 42 bekommen. Mit dieser Funktionalität Task.FromResult mussten wir ein Task Objekt erzeugen. Ein Task Objekt, das am heap liegt, das noch garbage collected werden muss. Jetzt neu brauchen wir keinen Task mehr für das Await. Also ich kann diese Methode modifizieren auf ValueTask. ValueTask returns the number new ValueTask(42) Await funktioiert auch weiterhin. Das Ganze noch mal starten. 42 Was ist jetzt tatsächlich der Unterschied? Schauen wir uns diesen ValueTask Typ an. Go to Definition. ValueTask ist definiert im Assembly System.Threading. Task.Extensions. Und ValueTask ist keine Klasse wie der Task, sondern eine struct, ein Value Type. Damit ersparen wir uns bei diesem Typ den Overhead vom heap. In manchen Szenarien brauchen wir aber alternatives. Manchmal läuft es länger, da brauchen wir einen Task, und manchmal geht es schneller da können wir gleich ein Ergebis liefern. Dafür können wir auch einen ValueTask nutzen. private static ValueTask. Definiere eine Methode, die jetzt einen Task zurück liefert. ReturnsATask. In der Implementierung erzeuge ich jetzt tatsächlich einen neuen Task. =Task.Run und implementiere das, mit einer Lambda Expression. Mit einem async Scope, ein WriteLine("running in a task...") und darin ein await, machen wir einen Delay, Task.Delay von drei Sekunden, und liefert erst dann den Wert 42 zurück. Diese Methode ist jetzt deklariert als ValueTask. Das heißt, wir brauchen einen Value Task, den Sie zurückliefern. return new ValueTask und da kann ich im Konstruktor auch einen Task mitgeben. Diese Task oder diesen Value dann später zurückliefern. Jetzt rufe ich auch diese Methode auf. result = await ReturnsATask() und ein WriteLine auf die Konsole. Starten wir das Programm. Jetzt müssen wir ein paar Sekunden warten und haben schließlich auch unser Ergebnis. Await ist flexibler geworden. Wir müssen nicht mehr auf Task warten, sondern irgendein Objekt, das getAwaiter zurückliefert. Und das ist zum Beispiel ValueTask. Tatsächlich gibt es auch in der Windows Runtime ein Objekt, auf das wir warten können. IAsyncOperation. Aber hier gab es in der Implementierung, wo IAsyncOperations auf Task umgewandelt wurde, und wir müssen tatsächlich auf Task warten. Neu nicht mehr. Wir können auf irgendein Objekt warten, das getAwaiter implementiert, Im Framework haben wir jetzt auch den ValueTask. Dabei ersparen wir uns ein Objekt. In den meisten Szenarien ist das tatsächlich unerheblich, kein Objekt zu haben. Die parallele Funktionalität hat meist mehr Overhead als ein Objekt selbst. Deshalb können Sie in Ihren Applikationen weiterhin Task nutzen. Für manche Libraries ist es aber sinnvoll, eigene Task Typen zu definieren. Und das ist jetzt ganz einfach geworden.

C# 7: Neue Funktionen

Entdecken und nutzen Sie die mit der neuen Version 7 hinzugekommenen Features der mächtigen Programmiersprache C#.

1 Std. 34 min (21 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
C# C# 7
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.03.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!