Kann jemand erklären, was dies in einer synchronen Methode bedeutet? Wenn ich versuche, die Methode in async
zu ändern, beschwert sich VS darüber.
Das funktioniert:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Das geht nicht:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Im Grunde möchte ich wissen, was das genau bedeutet: Task.FromResult<object>(null);
async
Methoden unterscheiden sich von normalen Methoden. Was auch immer Sie von async
Methoden zurückgeben, werden in Task
eingeschlossen.
Wenn Sie keinen Wert (void) zurückgeben, wird er in Task
eingeschlossen. Wenn Sie int
zurückgeben, wird er in Task<int>
Eingeschlossen und so weiter.
Wenn Ihre asynchrone Methode int
zurückgeben muss, markieren Sie den Rückgabetyp der Methode als Task<int>
Und geben nur int
und nicht den Task<int>
Zurück. . Der Compiler konvertiert int
für Sie in Task<int>
.
private async Task<int> MethodName()
{
await SomethingAsync();
return 42;//Note we return int not Task<int> and that compiles
}
Sameway, Wenn Sie Task<object>
Zurückgeben, sollte der Rückgabetyp Ihrer Methode Task<Task<object>>
Sein.
public async Task<Task<object>> MethodName()
{
return Task.FromResult<object>(null);//This will compile
}
Da Ihre Methode Task
zurückgibt, sollte sie keinen Wert zurückgeben. Andernfalls wird es nicht kompiliert.
public async Task MethodName()
{
return;//This should work but return is redundant and also method is useless.
}
Beachten Sie, dass die asynchrone Methode ohne await
-Anweisung nicht async
ist.
Sie müssen das Schlüsselwort await verwenden, wenn Sie async verwenden. Der Rückgabetyp Ihrer Funktion sollte generisch sein. Hier ein Beispiel mit Rückgabewert:
public async Task<object> MethodName()
{
return await Task.FromResult<object>(null);
}
Hier ist ein Beispiel ohne Rückgabewert:
public async Task MethodName()
{
await Task.CompletedTask;
}
Lese das:
TPL: http://msdn.Microsoft.com/en-us/library/dd460717 (v = vs.110) .aspx und Tasks: http://msdn.Microsoft. de/de-de/library/system.threading.tasks (v = vs.110) .aspx
Async: http://msdn.Microsoft.com/en-us/library/hh156513.aspx Erwarten: http://msdn.Microsoft.com/en-us/library/ hh156528.aspx
Das Hinzufügen des Schlüsselworts async ist nur syntaktischer Zucker, um die Erstellung einer Zustandsmaschine zu vereinfachen. Im Wesentlichen übernimmt der Compiler Ihren Code.
public async Task MethodName()
{
return null;
}
Und verwandelt es in;
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Wenn Ihr Code über await
Schlüsselwörter verfügt, muss der Compiler Ihre Methode in eine Klasse umwandeln, um die für die Ausführung erforderliche Zustandsmaschine darzustellen. Bei jedem Schlüsselwort await
bleiben der Status der Variablen und der Stapel in den Feldern der Klasse erhalten. Die Klasse fügt sich 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 am Anfang der Methode zusätzlicher Code hinzugefügt, um den Status der Variablen wiederherzustellen und zur nächsten Code-Platte zu springen.
Siehe Was erzeugt Async & Warten? für ein blutiges Beispiel.
Dieser Prozess hat viel mit der Art und Weise zu tun, wie der Compiler Iteratormethoden mit Yield-Anweisungen behandelt.
public static async Task<string> MyTask()
{
//C# anonymous AsyncTask
return await Task.FromResult<string>(((Func<string>)(() =>
{
// your code here
return "string result here";
}))());
}