Je pense que la vérité est ambiguë même à partir de la documentation Microsoft:
Dans Visual Studio 2012 et .NET Framework 4.5, toute méthode attribuée avec le async
mot clé ( Async
dans Visual Basic) est considérée comme une méthode asynchrone, et les compilateurs C # et Visual Basic effectuent les transformations nécessaires pour implémenter la méthode de manière asynchrone à l'aide de TAP. Une méthode asynchrone doit renvoyer Task
un Task<TResult>
objet ou un objet.
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
Ce n'est pas déjà vrai. Toute méthode avec async
est asynchrone et elle dit qu'elle doit retourner soit a Task
ou Task<T>
- ce qui n'est pas correct pour les méthodes en haut d'une pile d'appels, Button_Click par exemple, ou async void
.
Bien sûr, vous devez vous demander quel est l’intérêt de la convention?
Vous pourriez dire que la Async
convention de suffixe est de communiquer à l'utilisateur de l'API que la méthode est attendue. Pour qu'une méthode soit attendue, elle doit retourner Task
pour un void, ou Task<T>
pour une méthode de retour de valeur, ce qui signifie que seule cette dernière peut être suffixée Async
.
Ou vous pourriez dire que la Async
convention de suffixe est de communiquer que la méthode peut retourner immédiatement, abandonnant le thread actuel pour effectuer un autre travail et provoquant potentiellement des courses.
Cette citation de Microsoft doc dit:
Par convention, vous ajoutez «Async» aux noms des méthodes qui ont un modificateur Async ou async.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Ce qui ne mentionne même pas que vos propres méthodes asynchrones retournant ont Task
besoin du Async
suffixe, ce que je pense que nous sommes tous d'accord pour dire qu'ils le font.
La réponse à cette question pourrait donc être: les deux. Dans les deux cas, vous devez ajouter Async
aux méthodes avec un async
mot-clé et qui renvoie Task
ou Task<T>
.
Je vais demander à Stephen Toub de clarifier la situation.
Mettre à jour
Alors je l'ai fait. Et voici ce que notre brave homme a écrit:
Si une méthode publique renvoie une tâche et est de nature asynchrone (par opposition à une méthode connue pour s'exécuter toujours de manière synchrone jusqu'à la fin mais qui retourne toujours une tâche pour une raison quelconque), elle doit avoir un suffixe «Async». C'est la ligne directrice. Le but principal ici avec la dénomination est de rendre très évident pour un consommateur de la fonctionnalité que la méthode appelée ne terminera probablement pas tout son travail de manière synchrone; cela aide bien sûr également dans le cas où la fonctionnalité est exposée avec des méthodes synchrones et asynchrones, de sorte que vous avez besoin d'une différence de nom pour les distinguer. La manière dont la méthode réalise son implémentation asynchrone n'a pas d'importance pour la dénomination: si async / await est utilisé pour obtenir l'aide du compilateur, ou si les types et méthodes de System.Threading.Tasks sont utilisés directement (e. g. TaskCompletionSource) n'a pas vraiment d'importance, car cela n'affecte pas la signature de la méthode en ce qui concerne le consommateur de la méthode.
Bien sûr, il y a toujours des exceptions à une directive. Le plus notable dans le cas de la dénomination serait les cas où la raison d'être d'un type entier est de fournir des fonctionnalités axées sur l'async, auquel cas avoir Async sur chaque méthode serait excessif, par exemple les méthodes sur Task elle-même qui produisent d'autres tâches. .
En ce qui concerne les méthodes asynchrones à retour de vide, il n'est pas souhaitable de les avoir dans la zone publique, car l'appelant n'a aucun bon moyen de savoir quand le travail asynchrone est terminé. Cependant, si vous devez exposer publiquement une méthode asynchrone à retour vide, vous souhaiterez probablement avoir un nom qui indique que le travail asynchrone est en cours de lancement, et vous pouvez utiliser le suffixe «Async» ici si cela a du sens. Compte tenu de la rareté de ce cas, je dirais que c'est vraiment une décision au cas par cas.
J'espère que ça aide, Steve
Les conseils succincts de la phrase d'ouverture de Stephen sont assez clairs. Cela exclut async void
car il est inhabituel de vouloir créer une API publique avec une telle conception, car la manière correcte d'implémenter un vide asynchrone est de retourner une Task
instance simple et de laisser le compilateur faire sa magie. Cependant, si vous voulez un public async void
, alors l'ajout Async
est conseillé. D'autres async void
méthodes de haut de gamme telles que les gestionnaires d'événements ne sont généralement pas publiques et n'ont pas d'importance / ne sont pas qualifiées.
Pour moi, cela me dit que si je me pose des questions sur le suffixe Async
sur un async void
, je devrais probablement le transformer en un async Task
pour que les appelants puissent l'attendre, puis l'ajouter Async
.