Kann jemand erklären, was dies für eine synchrone Methode bedeutet? Wenn ich versuche, die Methode zu ändernasync
beschwert sich VS darüber.
Das funktioniert:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Das funktioniert nicht:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Im Grunde würde ich gerne wissen, was genau das bedeutet: Task.FromResult<object>(null);
c#
asynchronous
async-await
David Dury
quelle
quelle
return;
arbeite ...!void
Funktion zurückzugeben.Antworten:
async
Methoden unterscheiden sich von normalen Methoden. Was auch immer Sie vonasync
Methoden zurückgeben, sind in a eingeschlossenTask
.Wenn Sie keinen Wert (void) zurückgeben, wird er eingewickelt
Task
. Wenn Sieint
ihn zurückgeben, wird er eingewickeltTask<int>
und so weiter.Wenn Ihre asynchrone Methode zurückgegeben werden muss,
int
markieren Sie den Rückgabetyp der Methode alsTask<int>
und geben einfachint
nicht den zurückTask<int>
. Compiler wird die konvertierenint
zuTask<int>
für Sie.Sameway, Wenn Sie zurückgeben, sollte der Rückgabetyp
Task<object>
Ihrer Methode seinTask<Task<object>>
Da Ihre Methode zurückgibt
Task
, sollte sie keinen Wert zurückgeben. Andernfalls wird es nicht kompiliert.Beachten Sie, dass eine asynchrone Methode ohne
await
Anweisung dies nicht istasync
.quelle
DoStuff()
. Zum Beispiel:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
ist ein Beispiel.Sie müssen das Schlüsselwort await verwenden, wenn Sie asynchron verwenden, und Ihr Funktionsrückgabetyp sollte generisch sein. Hier ein Beispiel mit einem Rückgabewert:
Hier ist ein Beispiel ohne Rückgabewert:
Lese das:
TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx und Aufgaben: http://msdn.microsoft.com/en-us/library/system.threading .tasks (v = vs.110) .aspx
Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Warten Sie: http://msdn.microsoft.com/en-us/library/hh156528.aspx
quelle
null
direkt zurückkehren, anstatt auf eine Dummy-Aufgabe zu warten.async
Methode asynchron ausgeführt wird, mit dem Vorschlag, dasawait
Schlüsselwort irgendwo in der Methode zu verwenden. Ich schlage vor, nurreturn Task.FromResult((object)null);
dasasync
Schlüsselwort zu verwenden und zu entfernen , um das Compiler-Warngeräusch zu reduzieren.return
in einer Aufgabe zu verwenden, aber die Aufgabe wird weiterhin ausgeführt, dareturn
keinTask
Das Hinzufügen des asynchronen Schlüsselworts ist nur syntaktischer Zucker, um die Erstellung einer Zustandsmaschine zu vereinfachen. Im Wesentlichen nimmt der Compiler Ihren Code;
Und verwandelt es in;
Wenn Ihr Code
await
Schlüsselwörter enthält, muss der Compiler Ihre Methode in eine Klasse umwandeln , um die für die Ausführung erforderliche Zustandsmaschine darzustellen. Bei jedemawait
Schlüsselwort bleiben der Status der Variablen und der Stapel in den Feldern der Klasse erhalten. Die Klasse fügt sich selbst als Abschluss-Hook zu der Aufgabe hinzu, auf die Sie warten, und kehrt dann zurück.Wenn diese Aufgabe abgeschlossen ist, wird Ihre Aufgabe erneut ausgeführt. Daher wird oben in der Methode etwas zusätzlicher Code hinzugefügt, um den Status der Variablen wiederherzustellen und in die nächste Platte Ihres Codes zu springen.
Siehe Was generiert async & await?für ein blutiges Beispiel.
Dieser Prozess hat viel mit der Art und Weise zu tun, wie der Compiler mit Iteratormethoden mit Yield-Anweisungen umgeht.
quelle
Dies ist eine Aufgabe, die eine Aufgabe vom Typ String zurückgibt (anonyme C # -Funktion oder mit anderen Worten, eine Delegation wird 'Func' verwendet).
quelle
Um die richtigen Antworten von asynchronen Methoden zu erhalten, müssen Sie beim Aufrufen dieser Task-Methoden warten. Das wartet darauf, dass es wieder in den zurückgegebenen Werttyp und nicht in den Aufgabentyp konvertiert wird.
quelle