Ist es in Ordnung, Parameter mit zu übergeben await? Was sind die Vor- und Nachteile davon?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
Ist es in Ordnung, Parameter mit zu übergeben await? Was sind die Vor- und Nachteile davon?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
Antworten:
UPDATE: Diese Frage war das Thema meines Blogs im März 2020 . Weitere Informationen zu diesem Thema finden Sie hier. Danke für die interessante Frage!
Ich gehe hier davon aus, dass Sie beabsichtigt haben, dass dies ein Funktionsaufruf als einziges Mitglied der Argumentliste ist.
Wie andere angemerkt haben, gibt es keinen Unterschied zwischen
x = M(await FAsync());
und
var f = await FAsync();
x = M(f);
Und das ist das gleiche wie
var ftask = FAsync();
x = M(await ftask)
Es spielt also keine Rolle, wie Sie es schreiben, richtig?
Denken Sie darüber nach.
In diesem speziellen Szenario sind alle drei Workflows gleich. Hier besteht jedoch ein potenzieller Unterschied, wenn wir das Szenario nur geringfügig variieren. Erwägen:
x = M(await FAsync(), await GAsync());
Dies ist das gleiche wie
var f = await FAsync();
var g = await GAsync();
x = M(f, g);
und was wissen wir über diesen Workflow? Die GAsync-Aufgabe wird erst gestartet, wenn die FAsync-Aufgabe abgeschlossen ist! Es sieht jedoch so aus, als ob hier die Möglichkeit besteht, dass zwei Aufgaben gleichzeitig ausgeführt werden, wodurch der aktuelle Thread möglicherweise effizienter genutzt wird! Wahrscheinlich wäre der Workflow besser geschrieben als:
var ftask = FAsync();
var gtask = GAsync();
x = M(await ftask, await gtask);
Jetzt beginnen sowohl FAsync- als auch GAsync-Aufgaben, und wir rufen M erst auf, wenn beide beendet sind.
Mein Rat ist, sorgfältig darüber nachzudenken, wo Sie Ihre Erwartungen stellen. Denken Sie daran, dass ein Warten ein Punkt in einem asynchronen Workflow sein soll, an dem der Workflow asynchron angehalten wird, bis eine Voraussetzung für die Fortsetzung erfüllt ist . Wenn Sie das Warten auf eine Aufgabe verzögern können, bis dies tatsächlich eine Voraussetzung ist, können Sie möglicherweise einen Leistungsgewinn erzielen.
SqlConnectionoder DbContextbeispielsweise verwenden.
Es gibt keinen Laufzeitunterschied zwischen;
var results = MapResults(await GetDataAsync())
und
var tmp = await GetDataAsync();
var results = MapResults(tmp)
GetDataAsync) und keinen Methodenaufruf verwendet. Abhängig davon, wo dies Task GetDataAsync = CallSomeAsync()initialisiert wird, kann es zu erheblichen Unterschieden kommen, da die Aufgabe zum Zeitpunkt des Aufrufs bereits ausgeführt MapResults(await GetDataAsync)wird. Siehe Erics Antwort für weitere Details.