L'utilisation de la “Async” le suffixe d'un nom de la méthode dépend de si le "asynchrone" modificateur est-il utilisé?
Qu'est-ce que la convention pour la suffixant noms de méthode avec "Async"?
Si le "Async" suffixe être annexé seulement une méthode déclarée avec le async
modificateur?
public async Task<bool> ConnectAsync()
Ou suffit-il que la méthode retourne juste Task<T>
ou Task
?
public Task<bool> ConnectAsync()
- Pour la désignation de la partie, APPUYEZ sur la doc dit: méthodes Asynchrones ROBINET inclure la Async suffixe après le nom de l'opération; par exemple, GetAsync pour une opération get. Si vous êtes l'ajout d'un ROBINET méthode à une classe qui contient déjà le nom de la méthode avec l'Async suffixe, utiliser le suffixe TaskAsync à la place. Par exemple, si la classe a déjà un GetAsync méthode, utiliser le nom GetTaskAsync.
- Oui, je sais que "Async" doit être ajouté pour le nom de la méthode, mais ce n'est pas vraiment la question.
- ok, je suppose que j'ai été confondu par la question du titre de la "convention de Nommage des méthodes asynchrones"
- C'est un mal construites question. Les gens de chicane, équivoques réponses.
- Pourquoi pensez-vous qu'il est mal construit?
- Parce que beaucoup de gens ont mal compris et font valoir que la chose réelle à être demandé, en se demandant si ses une question en deux parties, etc. La preuve que son déroutant, c'est que les gens sont confus.
- Mal formulé la question.
- Pourquoi pensez-vous ainsi? Je ne peux pas comprendre pourquoi les gens ne comprennent pas cette question.
- Après la lecture de votre question initiale et les modifications ultérieures apportées ainsi que les réponses, dans l'édition de votre question, je crois que j'ai précisé à votre intention. Si ce n'est pas le cas, s'il vous plaît laissez-moi savoir. Bien sûr, vous pouvez modifier d'autres ou même de reculer mes modifications. Peu importe, si le résultat de mes modifications n'est pas la question que vous avez posée, c'est la question dont la réponse que je cherche. 🙂
- À ce jour, je ne comprends toujours pas le montant de la confusion que cette question a apparemment causé. Si vos éditions de mettre de l'ordre dans la confusion telle qu'il vous a aidé et peut peut-être aider les autres, alors je vous remercie de vos modifications vous avez réalisé quelque chose que je ne pouvais pas dans la formulation initiale. La question est maintenant de savoir si vieux maintenant que je peux à peine rappeler mon état d'esprit quand j'ai demandé ici et donc, l'intention initiale est de moins en moins important. La réponse de luc refléter le fait que tous n'étaient pas confondre. Je l'ai trouvé très utile.
- J'ai soudain se rappeler ce à quoi je pensais quand vous posez la question. Le problème fondamental est celui de l'intention. Je peux écrire une méthode retournant une Tâche et ajouter le "Async" suffixe, mais la méthode pourrait ou ne pourrait pas être bloquant. L'ajout de la
async
mot-clé pourrait communiquer plus clairement l'intention, c'est à dire ce qui suggère plus fortement qu'une méthode est en effet asynchrone.
Vous devez vous connecter pour publier un commentaire.
Je pense que la vérité est ambigu, même à partir de la documentation de Microsoft:
http://msdn.microsoft.com/en-us/library/hh873177(v=vs. 110).aspx
C'est pas bon déjà. Toute méthode avec
async
est asynchrone et puis son disant qu'elle doit renvoyer uneTask
ouTask<T>
- qui n'est pas bon pour les méthodes au sommet d'une pile d'appel, Button_Click par exemple, ouasync void
.Bien sûr, vous avez à considérer ce qui est le point de la convention?
On pourrait dire que le
Async
suffixe convention est de communiquer à l'utilisateur API que la méthode est awaitable. Pour une méthode à awaitable, il doit retournerTask
pour un vide, ouTask<T>
pour une valeur de retour de la méthode, ce qui signifie que seule cette dernière peut être suffixé avecAsync
.Ou vous pourriez dire que la
Async
suffixe convention est de communiquer que la méthode peut retourner immédiatement, en renonçant à le thread en cours pour effectuer d'autres travaux et pouvant causer des courses.Ce Microsoft doc citation dit:
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Qui ne mentionne même pas que vos propres méthodes asynchrones retour
Task
besoin de laAsync
suffixe, qui, je pense, nous sommes tous d'accord qu'ils font.Donc la réponse à cette question pourrait être: à la fois. Dans les deux cas, vous devez ajouter
Async
de méthodes avecasync
mot-clé et que le retourTask
ouTask<T>
.Je vais demander à Stephen Toub, pour clarifier la situation.
Mise à jour
Je l'ai fait. Et voici ce que notre bon homme a écrit:
De la brièveté des conseils de Stephen ouverture de la phrase est assez claire. Il exclut
async void
parce qu'il est rare de vouloir créer une API publique avec une telle conception, depuis la bonne façon de mettre en œuvre un asynchrone à vide est de retour une plaineTask
instance et laisser le compilateur à sa magie. Toutefois, si vous ne voulez qu'unpublic async void
, en ajoutantAsync
est conseillé. D'autres haut-de-pileasync void
des méthodes telles que les gestionnaires d'événements sont généralement pas en public et n'a pas d'importance/qualifier.Pour moi, il me dit que si je me demande à propos de suffixant
Async
sur unasync void
, je devrais en faire unasync Task
sorte que les appelants peuvent l'attendre, puis ajouterAsync
.PersonString
ouPriceDecimal
alors pourquoi utiliserGetAsync
- API consommateurs de async l'API n'a pas besoin de s'inquiéter de ce que la requête renvoie toujours après que toutes les tâches sont terminées, de toute façon. Son ridicule et vraiment ennuyeux moi. Mais juste une autre convention que personne ne sait vraiment pourquoi il est là.Je construire un grand nombre d'API de services et d'autres applications qui en appelle d'autres systèmes où la plupart de mon code est en cours d'exécution asynchrone.
Ma propre règle de base que je suis est:
Exemples:
Une seule méthode:
Même méthode avec deux signatures:
Ce sens puisque c'est les mêmes données qui sont retournés, mais la seule chose qui diffère, c'est le chemin de retour de données, et non les données.
Je pense aussi que cela conventions de nommage existe en raison de la nécessité d'introduire des méthodes asynchrones et encore maintenir la compatibilité ascendante.
Je soutiens que le nouveau code ne devriez pas utiliser la Async suffixe. Il est tout aussi évident que le type de retour de la Chaîne, ou Int comme mentionné précédemment dans ce fil.
La Basée sur les tâches du Modèle Asynchrone (TAP) dicte que les méthodes doit toujours retourner une
Task<T>
(ouTask
) et être nommé avec un Async suffixe; ceci est distinct de l'utilisation deasync
. Les deuxTask<bool> Connect()
etasync
Task<bool> Connect()
de compiler et d'exécuter très bien, mais vous ne serez pas en suivant le ROBINET convention de nommage.Si le corps de la méthode (quel que soit le type de retour ou le nom) comprend
await
, vous doit utilisationasync
; et le compilateur va vous dire "Le 'attendre' opérateur ne peut être utilisé dans une méthode asynchrone. ...". De retourTask<T>
ouTask
n'est pas "assez" pour éviter d'utiliserasync
. Voir async (Référence C#) pour plus de détails.Les deux
async
Task<bool> ConnectAsync()
etTask<bool> ConnectAsync()
suivent correctement le ROBINET conventions. Vous pourriez toujours utiliser leasync
mot-clé, mais vous obtiendrez un avertissement du compilateur "Cette méthode async le manque d '"attendre" opérateurs et exécuté de manière synchrone. ..." si le corps n'utilise pasawait
.async
mot-clé.async
est la deuxième partie de la question.async
mot clé sur ses méthodes. Il est évident qu'il sait déjà quand il en a besoin. Il demande si une méthode qui n'a pas laasync
mot-clé, mais renvoie une tâche, utilisez ajoutAsync
pour le nom de la méthode. Cette réponse, bien que pas mal, répond à une question entièrement différente de ce que l'OP demande, qui n'est pas utile.async
modificateur. Voir également OPs exemples,public async Task<bool> ConnectAsync()
(avecasync
modificateur) vspublic Task<bool> ConnectAsync()
(sansasync
modificateur). La méthode nom lui-même a le suffixe "Async" dans les deux cas.Task
ou des méthodes qui ontasync Task
.Que. Le
async
mot-clé n'est pas la vraie question. Si vous implémentez l'asynchronie sans l'aide de laasync
mot-clé de la méthode est encore "Async", dans le sens général.Depuis
Task
etTask<T>
sont à la fois awaitable types, ils représentent certains opération asynchrone. Ou au moins qu'ils sont censés représenter.Vous devez ajouter le suffixe
Async
une méthode qui, dans certains cas (pas nécessairement tous), ne retourne pas une valeur mais renvoie un wrapper autour d'une opération en cours. Cette enveloppe est généralement unTask
, mais sur Windows RT, il peut êtreIAsyncInfo
. Suivez votre instinct et n'oubliez pas que si un utilisateur de votre code voit leAsync
fonction, il ou elle saura que l'invocation de cette méthode est découplé du résultat de cette méthode et qu'ils doivent agir en conséquence.Noter qu'il existe des méthodes telles que
Task.Delay
etTask.WhenAll
de retourTask
et pourtant n'ont pas laAsync
suffixe.Également noter qu'il y a
async void
méthodes qui représentent feu et oublier méthode asynchrone et vous devriez mieux être conscient que la méthode est construite de telle façon.Je dirais qu'il doit utiliser la Async-suffixe si elle renvoie une Tâche, peu importe si la méthode est déclarée auprès de la
async
modificateur ou pas.La raison derrière cela est que le nom est déclarée dans l'interface. L'interface déclare le type de retour qui est un
Task
. Ensuite, il existe deux implémentations de cette interface, on met en œuvre la mise en œuvre à l'aide de laasync
modificateur, l'autre pas.Dans La Programmation asynchrone avec async et await (C#), Microsoft propose les conseils suivants:
Je trouve cette orientation incomplète et insatisfaisante. Est-ce à dire que, en l'absence de la
async
modificateur, cette méthode doit être nomméConnect
au lieu deConnectAsync
?Je ne le pense pas. Comme indiqué dans le concise réponse par @Servy et le plus réponse détaillée par @Luc Puplett, je crois qu'il est approprié et en effet prévu que cette méthode devrait être nommé
ConnectAsync
(parce qu'il renvoie un awaitable). En plus de l'appui de cela, @John Skeet dans cette réponse à une autre question ajouteAsync
pour le nom de la méthode, indépendamment de la présence de laasync
modificateur.Enfin, sur une autre question, envisager ce commentaire par @Damien_The_Unbeliever:
De cela, je en déduire que c'est la nature asynchrone de la méthode qui dicte la façon dont il devrait être nommé. L'utilisateur de la méthode n'a même pas de savoir si le
async
modificateur est utilisé dans sa mise en œuvre (sans le code source C# ou CIL).