Quelqu'un peut-il expliquer ce que cela signifie dans une méthode synchrone? Si j'essaie de changer la méthode, async
alors VS m'en plaint.
Cela marche:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Cela ne fonctionne pas:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Donc, fondamentalement, j'aimerais savoir ce que cela signifie exactement: Task.FromResult<object>(null);
c#
asynchronous
async-await
David Dury
la source
la source
return;
travaille aussi ...!void
fonction.Réponses:
async
les méthodes sont différentes des méthodes normales. Tout ce que vous retournez desasync
méthodes est enveloppé dans un fichierTask
.Si vous ne retournez aucune valeur (nulle), elle sera enveloppée
Task
, si vous retournez,int
elle sera enveloppéeTask<int>
et ainsi de suite.Si votre méthode asynchrone doit retourner,
int
vous marquez le type de retour de la méthode commeTask<int>
et vous retournerez plainint
pas leTask<int>
. Le compilateur convertira leint
enTask<int>
pour vous.De même, lorsque vous retournez
Task<object>
le type de retour de votre méthode doit êtreTask<Task<object>>
Puisque votre méthode est de retour
Task
, elle ne doit renvoyer aucune valeur. Sinon, il ne se compilera pas.Gardez à l'esprit que la méthode async sans
await
instruction ne l'est pasasync
.la source
DoStuff()
également attendre . Par exemple:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
est un exemple.Vous devez utiliser le mot clé await lorsque vous utilisez async et votre type de retour de fonction doit être générique Voici un exemple avec valeur de retour:
Voici un exemple sans valeur de retour:
Lisez 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 = contre 110) .aspx
Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Attendre: http://msdn.microsoft.com/en-us/library/hh156528.aspx
la source
null
directement au lieu d'attendre une tâche factice.async
méthode s'exécutera de manière asynchrone avec une suggestion d'utiliser leawait
mot - clé quelque part dans la méthode. Je suggère simplement d'utiliserreturn Task.FromResult((object)null);
et de supprimer leasync
mot - clé pour réduire le bruit d'avertissement du compilateur.return
dans une tâche, mais la tâche continue de s'exécuter, car ellereturn
ne renvoie pas unTask
L'ajout du mot-clé async n'est que du sucre syntaxique pour simplifier la création d'une machine à états. En substance, le compilateur prend votre code;
Et le transforme en;
Si votre code a des
await
mots-clés, le compilateur doit prendre votre méthode et la transformer en une classe pour représenter la machine à états requise pour l'exécuter. A chaqueawait
mot-clé, l'état des variables et de la pile seront conservés dans les champs de la classe, la classe s'ajoutera comme hook de complétion à la tâche que vous attendez, puis reviendra.Une fois cette tâche terminée, votre tâche sera à nouveau exécutée. Ainsi, du code supplémentaire est ajouté en haut de la méthode pour restaurer l'état des variables et passer à la dalle suivante de votre code.
Voir Que génère async & await? pour un exemple sanglant.
Ce processus a beaucoup en commun avec la façon dont le compilateur gère les méthodes d'itération avec des instructions yield.
la source
Il s'agit d'une tâche qui renvoie une tâche de type String (fonction anonyme C # ou en d'autres termes une délégation est utilisée 'Func')
la source
Afin de récupérer les réponses appropriées des méthodes asynchrones, vous devez mettre en attente lors de l'appel de ces méthodes de tâche. Cela attendra de le reconvertir dans le type de valeur retourné plutôt que dans le type de tâche.
la source