2015-05-27 10 views
18

This blog post erwähnt die neuen Task-APIs, einschließlich einer neuen Task.CompletedTask-Eigenschaft, die in .NET 4.6 eingeführt wurde.Worum geht es in .NET 4.6's Task.CompletedTask?

Warum wurde das hinzugefügt? Wie ist das besser als, sagen wir Task.FromResult(whatever)?

+3

Ist nicht klar genug Absicht? – svick

+0

Der Grund dafür ist, dass Sie Speicher sparen können, indem Sie statische unveränderliche Tasks erstellen, die sich in festen Zuständen befinden. Wenn Sie eine abgeschlossene Aufgabe zurückgeben müssen, weil z. Sie laden nur optional Daten aus dem Internet herunter und geben andernfalls eine Dummy-Aufgabe zurück, die auf "Erledigt" gesetzt ist, damit der Anrufer, der auf Ihre Aufgabe wartet, sofort fortfahren kann. Bis jetzt mussten Sie Ihre eigene Instanz erstellen und zwischenspeichern oder mit TaskCompletionSource jedes Mal neu erstellen. –

+0

Der Blogpost erklärt bereits, warum "Task.CompletedTask" hinzugefügt wurde ... Er erwähnt ausdrücklich "Bibliothekscode, der sich um die Leistung kümmert und Zuteilungen vermeidet". Vergleichen Sie das nun mit Ihrem 'Task.FromResult (whatever)': vermeidet das Zuteilungen? Nein, tut es nicht. – hvd

Antwort

24

Task.FromResult(whatever) funktioniert für Task<TResult>, aber bis 4.6 gab es nichts für die nicht generische Aufgabe. Sie könnten FromResult mit einem Dummy-Wert verwenden und implizit in Task umwandeln, aber das verschleiert etwas die Absicht (Sie geben wirklich keinen asynchronen Wert zurück) und weist Objekte darunter zu (während CompletedTask zwischen allen Aufrufern zwischengespeichert und geteilt werden kann) .

Es ist nicht ungewöhnlich, in den aktuellen Codebases (4.5.2 und älter) benutzerdefinierte statische abgeschlossene Aufgaben zu sehen, daher ist es meiner Meinung nach sinnvoll, sie in das Framework selbst zu integrieren.

Verwandte Themen