Quelle est la convention pour suffixer les noms de méthodes avec "Async"?
Le suffixe "Async" doit-il être ajouté uniquement à une méthode déclarée avec le async
modificateur?
public async Task<bool> ConnectAsync()
Ou est-ce suffisant que la méthode retourne simplement Task<T>
ou Task
?
public Task<bool> ConnectAsync()
c#
.net
async-await
naming-conventions
naming
Kasperhj
la source
la source
Réponses:
Je pense que la vérité est ambiguë même à partir de la documentation Microsoft:
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 aTask
ouTask<T>
- ce qui n'est pas correct pour les méthodes en haut d'une pile d'appels, Button_Click par exemple, ouasync 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 retournerTask
pour un void, ouTask<T>
pour une méthode de retour de valeur, ce qui signifie que seule cette dernière peut être suffixéeAsync
.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:
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 duAsync
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 unasync
mot-clé et qui renvoieTask
ouTask<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:
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 uneTask
instance simple et de laisser le compilateur faire sa magie. Cependant, si vous voulez unpublic async void
, alors l'ajoutAsync
est conseillé. D'autresasync 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 unasync void
, je devrais probablement le transformer en unasync Task
pour que les appelants puissent l'attendre, puis l'ajouterAsync
.la source
PersonString
ouPriceDecimal
alors pourquoi l'utiliserGetAsync
- les consommateurs d'API d'API async n'ont pas à s'inquiéter à ce sujet car la demande revient toujours une fois toutes les tâches terminées de toute façon. C'est idiot et vraiment ennuyeux. Mais c'est juste une autre convention que personne ne sait vraiment pourquoi c'est là.Je construis beaucoup de services API et d'autres applications qui appellent d'autres systèmes où la plupart de mon code s'exécute de manière asynchrone.
Ma propre règle de base que je suis:
Exemples:
Une seule méthode:
Même méthode avec deux signatures:
Cela a du sens car ce sont les mêmes données qui sont renvoyées, mais la seule chose qui diffère est la manière de renvoyer les données , pas les données elles-mêmes.
Je pense également que ces conventions de dénomination existent en raison de la nécessité d'introduire des méthodes asynchrones tout en conservant la compatibilité ascendante.
Je soutiens que le nouveau code ne devrait pas utiliser le suffixe Async. C'est tout aussi évident que le type de retour String ou Int comme mentionné précédemment dans ce thread.
la source
Le modèle asynchrone basé sur les tâches (TAP) dicte que les méthodes doivent toujours renvoyer un
Task<T>
(ouTask
) et être nommées avec un suffixe Async ; ceci est distinct de l'utilisation deasync
. Les deuxTask<bool> Connect()
et se compileront et fonctionneront très bien, mais vous ne suivrez pas la convention de dénomination TAP.async
Task<bool> Connect()
Si le corps de la méthode (quel que soit le type ou le nom de retour) inclut
await
, vous devez utiliserasync
; et le compilateur vous dira "L'opérateur 'await' ne peut être utilisé que dans une méthode asynchrone. ...". Le retourTask<T>
ouTask
n'est pas "suffisant" pour éviter d'utiliserasync
. Voir async (référence C #) pour plus de détails.Les deux et respectent correctement les conventions TAP. Vous pouvez toujours utiliser le mot - clé, mais vous obtiendrez un avertissement du compilateur "Cette méthode asynchrone ne dispose pas des opérateurs 'await' et s'exécutera de manière synchrone. ..." si le corps ne l'utilise pas .
async
Task<bool> ConnectAsync()
Task<bool> ConnectAsync()
async
await
la source
async
mot - clé.async
- clé est la deuxième partie de la question.async
modificateur. Voir aussi les exemples OP,public async Task<bool> ConnectAsync()
(avecasync
modificateur) vspublic Task<bool> ConnectAsync()
(sansasync
modificateur). Le nom de la méthode lui-même a le suffixe "Async" dans les deux cas.Task
ou des méthodes qui ontasync Task
.Cette. Le
async
mot clé n'est pas le vrai problème ici. Si vous implémentez l'asynchronie sans utiliser leasync
mot - clé, la méthode est toujours "Async", au sens général.la source
Depuis
Task
etTask<T>
sont tous deux des types attendables, ils représentent certains opération asynchrone. Ou du moins, ils devraient représenter.Vous devez ajouter un suffixe
Async
à une méthode qui, dans certains cas (pas nécessairement tous), ne renvoie pas de valeur mais renvoie plutôt un wrapper autour d'une opération en cours. Ce wrapper est généralement unTask
, mais sur Windows RT, il peut l'êtreIAsyncInfo
. Suivez votre instinct et rappelez-vous que si un utilisateur de votre code voit laAsync
fonction, il saura que l'invocation de cette méthode est découplée du résultat de cette méthode et qu'il doit agir en conséquence.Notez qu'il existe des méthodes telles que
Task.Delay
etTask.WhenAll
qui retournentTask
et qui n'ont pas leAsync
suffixe.Notez également qu'il existe des
async void
méthodes qui représentent le feu et oublient la méthode asynchrone et vous devriez mieux être conscient que la méthode est construite de cette manière.la source
Je dirais qu'il devrait utiliser le suffixe Async s'il renvoie une tâche, que la méthode soit déclarée avec le
async
modificateur ou non.La raison en est que le nom est déclaré dans l'interface. L'interface déclare le type de retour qui est un
Task
. Ensuite, il y a deux implémentations de cette interface, une implémentation l'implémente en utilisant leasync
modificateur, l'autre non.la source
Dans la programmation asynchrone avec async et await (C #) , Microsoft propose les conseils suivants:
Je trouve cette orientation incomplète et insatisfaisante. Cela signifie-t-il qu'en l'absence du
async
modificateur, cette méthode devrait être nommée à laConnect
place deConnectAsync
?Je ne pense pas. Comme indiqué dans la réponse concise par @Servy et plus réponse détaillée par @Luke Puplett , je crois qu'il est approprié et bien prévu que cette méthode devrait être nommé
ConnectAsync
(car il renvoie un awaitable). À l'appui de cela, @John Skeet dans cette réponse à une autre question ajouteAsync
au nom de la méthode indépendamment de la présence duasync
modificateur.Enfin, sur une autre question , considérez ce commentaire de @Damien_The_Unbeliever :
De là, j'en déduis que c'est la nature asynchrone de la méthode qui dicte comment elle doit être nommée. L'utilisateur de la méthode ne saura même pas si le
async
modificateur est utilisé dans son implémentation (sans le code source C # ou CIL).la source