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);
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
.
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
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.
public static async Task<string> MyTask()
{
//C# anonymous AsyncTask
return await Task.FromResult<string>(((Func<string>)(() =>
{
// your code here
return "string result here";
}))());
}