Tritt eine implizite Konvertierung zwischen Task <> und int auf?
Nee. Dies ist nur ein Teil dessen, wie async/ awaitfunktioniert.
Jede als deklarierte Methode asyncmuss 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 Tauf 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 awaitAusdruck 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 awaitdas Gegenteil der Fall ist - es packt a Task<T>in einen TWert aus. So funktioniert diese Zeile:
string urlContents = await getStringTask;
... aber natürlich wird es asynchron entpackt, während nur die Verwendung Resultblockieren würde, bis die Aufgabe abgeschlossen ist. ( awaitKann 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.)
asyncSchlüsselwort darum kümmert .