Les réponses de SLaks et Killercam sont bonnes; Je pensais simplement 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 retourner void
, Task
ou Task<T>
. Quelles sont les différences entre eux?
Une Task<T>
méthode asynchrone de retour peut être attendue, et lorsque la tâche sera terminée, elle proposera un T.
Une Task
méthode asynchrone de retour peut être attendue, et lorsque la tâche est terminée, la poursuite de la tâche est planifiée pour s'exécuter.
UNE void
méthode asynchrone de retour ne peut pas être attendue; c'est une méthode "feu et oublie". Cela fonctionne de manière asynchrone et vous n'avez aucun moyen de savoir quand cela est fait. C'est plus qu'un peu bizarre; comme le dit SLaks, vous ne feriez normalement cela que lorsque vous créez un gestionnaire d'événements asynchrone. L'événement se déclenche, le gestionnaire s'exécute; personne ne va "attendre" la tâche retournée par le gestionnaire d'événements parce que les gestionnaires d'événements ne retournent pas de tâches, et même s'ils l'ont fait, 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 await
édité:
Quels types de méthodes peuvent être await
édités? Une méthode de retour des annulations peut-elle être utilisée await
?
Non, une méthode de retour de null ne peut pas être attendue. Le compilateur se traduit await M()
par un appel à M().GetAwaiter()
, où GetAwaiter
peut être une méthode d'instance ou une méthode d'extension. La valeur attendue doit être celle pour laquelle vous pouvez obtenir un serveur; clairement une méthode de retour de vide ne produit pas de valeur à partir de laquelle vous pouvez obtenir un serveur.
Task
-les méthodes de retour peuvent produire des valeurs attendues. Nous prévoyons que des tiers voudront créer leurs propres implémentations d' Task
objets similaires qui peuvent être attendus, et vous pourrez les attendre. Cependant, vous ne serez pas autorisé à déclarer des async
méthodes qui renvoient autre chose que void
, Task
ou Task<T>
.
(MISE À JOUR: Ma dernière phrase peut être falsifiée par une future version de C #; il existe une proposition d'autoriser des types de retour autres que les types de tâches pour les méthodes asynchrones.)
(MISE À JOUR: la fonctionnalité mentionnée ci-dessus a été intégrée à C # 7.)