Les réponses de SLaks et de Killercam sont bonnes ; j'ai pensé ajouter un peu plus de contexte.
Votre première question porte essentiellement sur les méthodes qui peuvent être marquées. async
.
Une méthode marquée comme async
peut renvoyer void
, Task
o Task<T>
. Quelles sont les différences entre eux ?
A Task<T>
Une méthode asynchrone qui revient peut être attendue, et lorsque la tâche est terminée, elle propose un T.
A Task
Les méthodes asynchrones qui reviennent peuvent être attendues, et lorsque la tâche se termine, la suite de la tâche est programmée pour être exécutée.
A void
Une méthode asynchrone qui revient ne peut pas être attendue ; il s'agit d'une méthode "à utiliser et à oublier". Elle fonctionne de manière asynchrone et vous n'avez aucun moyen de savoir quand elle a terminé. C'est plus qu'un peu bizarre ; comme le dit SLaks, normalement vous ne feriez cela que lors de la création d'un gestionnaire d'événement asynchrone. L'événement se déclenche, le gestionnaire s'exécute ; personne ne va "attendre" la tâche renvoyée par le gestionnaire d'événement parce que les gestionnaires d'événements ne renvoient pas de tâches, et même s'ils le faisaient, quel code utiliserait la tâche pour quelque chose ? Ce n'est généralement pas le code utilisateur qui transfère le contrôle au gestionnaire en premier lieu.
Votre deuxième question, dans un commentaire, porte essentiellement sur ce qui peut être fait. await
éd :
Quels types de méthodes peuvent être await
ed ? Une méthode à retour nul peut-elle être await
ed ?
Non, une méthode à retour nul ne peut pas être attendue. Le compilateur traduit await M()
en un appel à M().GetAwaiter()
donde GetAwaiter
peut être une méthode d'instance ou une méthode d'extension. La valeur attendue doit être une valeur pour laquelle vous pouvez obtenir un attendeur ; il est clair qu'une méthode à retour nul ne produit pas une valeur à partir de laquelle vous pouvez obtenir un attendeur.
Task
-Les méthodes à retour d'information peuvent produire des valeurs attendues. Nous prévoyons que des tiers voudront créer leurs propres implémentations de Task
-comme des objets que l'on peut attendre, et vous pourrez les attendre. Cependant, vous ne serez pas autorisé à déclarer des objets async
les méthodes qui renvoient autre chose que void
, Task
o Task<T>
.
(MISE À JOUR : ma dernière phrase pourrait être falsifiée par une future version de C# ; il existe une proposition visant à autoriser des types de retour autres que les types de tâches pour les méthodes asynchrones).
(MISE À JOUR : la fonction mentionnée ci-dessus a été intégrée à C# 7).