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 asyncpeut retourner void, Taskou 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 Taskmé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ù GetAwaiterpeut ê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' Taskobjets similaires qui peuvent être attendus, et vous pourrez les attendre. Cependant, vous ne serez pas autorisé à déclarer des asyncméthodes qui renvoient autre chose que void, Taskou 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.)