Tritt eine implizite Konvertierung zwischen Task <> und int auf?
Nee. Dies ist nur ein Teil dessen, wie async
/ await
funktioniert.
Jede als deklarierte Methode async
muss den Rückgabetyp haben:
void
(wenn möglich vermeiden)
Task
(kein Ergebnis über die Benachrichtigung über Fertigstellung / Fehler hinaus)
Task<T>
(für ein logisches Ergebnis des Typs T
auf asynchrone Weise)
Der Compiler führt alle erforderlichen Umbrüche durch. Der Punkt ist, dass Sie asynchron zurückkehren urlContents.Length
- Sie können die Methode nicht einfach zurückgeben lassen int
, da die eigentliche Methode zurückkehrt, wenn sie auf den ersten await
Ausdruck trifft, der noch nicht abgeschlossen ist. Stattdessen wird a zurückgegeben, Task<int>
das abgeschlossen wird, wenn die asynchrone Methode selbst abgeschlossen ist.
Beachten Sie, dass await
das Gegenteil der Fall ist - es packt a Task<T>
in einen T
Wert aus. So funktioniert diese Zeile:
string urlContents = await getStringTask;
... aber natürlich wird es asynchron entpackt, während nur die Verwendung Result
blockieren würde, bis die Aufgabe abgeschlossen ist. ( await
Kann andere Typen auspacken, die das erwartete Muster implementieren, wird aber Task<T>
wahrscheinlich am häufigsten verwendet.)
Dieses doppelte Ein- und Auspacken ermöglicht es Async, so zusammensetzbar zu sein. Zum Beispiel könnte ich eine andere asynchrone Methode schreiben, die Ihre aufruft und das Ergebnis verdoppelt:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(Oder einfach return await AccessTheWebAsync() * 2;
natürlich.)
async
Schlüsselwort darum kümmert .