web-dev-qa-db-fra.com

async attente en retour

Quelqu'un peut-il expliquer ce que cela signifie dans une méthode synchrone? Si j'essaie de changer la méthode en async, VS se plaint de cela.

Cela marche:

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

Cela ne marche pas:

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

Donc, fondamentalement, j'aimerais savoir ce que cela signifie exactement: Task.FromResult<object>(null);

106
David Dury

Les méthodes async sont différentes des méthodes normales. Tout ce que vous retournez de la méthode async est encapsulé dans un Task.

Si vous ne renvoyez aucune valeur (void), il sera enveloppé dans Task, si vous renvoyez int, il sera enveloppé dans Task<int> et ainsi de suite.

Si votre méthode asynchrone doit renvoyer int, vous devez marquer le type de résultat de la méthode comme Task<int> et vous renverrez plain int et non le Task<int>. Le compilateur convertira la int en Task<int> pour vous.

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}

De même, lorsque vous renvoyez Task<object>, le type de retour de votre méthode doit être Task<Task<object>>.

public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

Puisque votre méthode renvoie Task, elle ne devrait renvoyer aucune valeur. Sinon, il ne sera pas compilé.

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

N'oubliez pas qu'une méthode asynchrone sans instruction await n'est pas async.

181
Sriram Sakthivel

Vous devez utiliser le mot-clé wait lorsque async et que le type de retour de votre fonction doivent être génériques. Voici un exemple avec une valeur de retour:

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

Voici un exemple sans valeur de retour:

public async Task MethodName()
{
    await Task.CompletedTask;
}

Lire ces:

TPL: http://msdn.Microsoft.com/en-us/library/dd460717 (v = vs.110) .aspx et tâches: http://msdn.Microsoft. com/en-us/library/system.threading.tasks (v = vs.110) .aspx

Async: http://msdn.Microsoft.com/en-us/library/hh156513.aspx Attendre: http://msdn.Microsoft.com/en-us/library/ hh156528.aspx

41
Major

L'ajout du mot-clé asynchrone n'est que du sucre syntaxique pour simplifier la création d'une machine à états. En substance, le compilateur prend votre code;

public async Task MethodName()
{
     return null;
}

Et le transforme en;

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

Si votre code contient des mots-clés await, le compilateur doit transformer votre méthode en une classe représentant la machine à états requise pour l'exécuter. À chaque await mot-clé, l'état des variables et la pile seront conservés dans les champs de la classe. La classe s'ajoutera elle-même comme un crochet d'achèvement à la tâche que vous attendez, puis retournera.

Une fois cette tâche terminée, votre tâche sera exécutée à nouveau. Ainsi, du code supplémentaire est ajouté en haut de la méthode pour restaurer l'état des variables et passer à la prochaine dalle de votre code.

Voir Qu'est-ce que async & attend générer? pour un exemple sanglant.

Ce processus a beaucoup en commun avec la manière dont le compilateur gère les méthodes d'itérateur avec les instructions de rendement.

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