it-swarm.com.de

async warte auf Rückkehr Aufgabe

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);

106
David Dury

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.

181

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

41
Major

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.

21
Jeremy Lakeman
    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";

        }))());
    }
2
Adel Mourad