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.
Ist nicht klar genug Absicht? – svick
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. –
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