-1
votes

Attendre la méthode des tâches ASYNC avec la logique synchrone C #

J'ai une question stupide de demander à chacun d'apprendre de meilleures pratiques types de retour async dans C #. J'ai une méthode comme celle-ci:

        public virtual async Task OnConnected(WebSocket socket, HttpContext context)
        {
            string connectionId = CreateConnectionId(context);

            ConnectionManager.AddSocket(connectionId, socket);

            //Question is here await what ?

        }


8 commentaires

" question est ici attendre ce que " rien, vous n'avez rien à attendre ici (que vous avez montré), car il se trouve cette méthode n'a pas besoin de renvoyer une tâche ou être async . En outre, nous nous demandons de ne pas dire que la bowevote est une invitation ouverte à la bowevote


Votre méthode a-t-elle une certaine implémentation asynchrounour ou appeler des méthodes sont asynchronisées?


@ EHSAN SAJJAD: Ma méthode n'a pas d'async logique et cette méthode est remplacée de la classe de base a un modificateur ASYNC


Peut-être une petite lecture ferait :) Async Tâches < / a>


Même si vous avez dit de ne pas frapper, mais une question comme celle-ci prouve que vous n'avez effectué aucune recherche sur Async-attendre et attendre que quelqu'un vous nourrit. Le Créateur de C #, MS a leur propre aide pour vous. docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/... ou peut être moyen.com/@deep_blue_day/...


@ Michael Randall: Ma méthode n'a pas de logique ASYNC et cette méthode est remplacée de la classe de base contient un modificateur ASYNC et un avertissement IDE Cette méthode doit avoir un modificateur ASYNC. Devrais-je attendre la tâche.delay (0) ou attendre la tâche.comPletedTask, est-ce que ça va?


tks tellement


@ Codeur sans cerveau sans cervelle: J'ai déjà étudié de quelques meilleures pratiques, mais je n'ai plus d'expérience à ce sujet et j'aimerais poster pour demander à quelqu'un de m'aider et que je suis très heureux. BTW TKS pour votre aide et vos ressources


3 Réponses :


4
votes

S'il n'y a rien à attendre et ceci est une méthode remplacée. Il suffit d'ignorer l'avertissement du compilateur (ou pragma est sorti) et ne faites rien) et ne faites rien.

pourquoi ne rien faire?

parce que lorsque vous placez un async Sur une méthode, le compilateur place automatiquement toute exception sur la tâche pour vous.

ou vous pouvez supprimer le async et renvoyer une tâche complétée xxx

mon conseil serait être de faire le premier, (ne rien faire)

Toutefois, si vous alliez aller la deuxième approche, il serait préférable de placer toutes les exceptions sur la tâche retournée tout comme les Async et attendre le motif serait. xxx


2 commentaires

Je me souviens que dans ce lien: markheath.net/post/async-antifatterns a dit que l'anti- Le motif est d'essayer de prendre sans attendre. Est-ce que ça va pour ce cas


@Khanhtuong si la méthode n'est pas async alors vous ne pouvez pas attendre . Toutefois, dans le deuxième exemple, nous marquons que nous placons des exceptions sur la tâche de la même manière que l'async async et l'attente de modèle .. une fois encore, si vous n'êtes pas sûr dans ce cas, ne faites rien



2
votes

Si vous n'avez aucune opération asynchrone à attendre, vous pouvez également faire la méthode de méthode synchrone normale. Si vous faites une méthode async, il est donc bon de nommer la méthode de telle sorte qu'il se termine par ASYNC comme OnconnecteAsync.

Généralement, vous utilisez des méthodes asynchronisées / attendre lorsque vous avez des opérations d'E / S (comme accès au fichier, téléchargement Web / téléchargement) pouvant être effectuée indépendamment de votre logique de programme. Mettez simplement le flux de contrôle va comme,

  1. Le fil principal appelle la méthode ASYNC pour déclencher l'opération d'E / S
  2. Le contrôle est renvoyé au fil principal après une attente à laquelle on a rencontré; Habituellement, un autre thread est attribué à exécuter des déclarations restantes de la méthode Async
  3. Le fil principal continue d'exécuter ses déclarations jusqu'à ce qu'elle nécessite le résultat de l'opération d'E / S
  4. Le fil principal attend le résultat de la méthode ASYNC (c'est-à-dire le résultat de l'opération d'E / S) en appelant toute méthode d'attente ou getResult de tâche
  5. Une fois le fil principal obtient les résultats, il continue d'exécuter ses déclarations

    Vous pouvez parcourir de nombreuses vidéos de tutoriels sur YouTube sur Async / Await.


0 commentaires

3
votes

Apprenez quelques meilleures pratiques Types de retour ASYNC en C #.

La première règle de async est "ne l'utilise pas à moins que vous n'ayez besoin." La deuxième règle est "Commencez par attendre , pas async ".

Cette partie de la question est incorrecte:

// question est ici attendu quoi?

au lieu de commencer avec async et d'essayer de "rendre le code asynchrone", vous devez commencer à l'extrémité opposée: identifier ce qui est naturellement asynchrone (c'est-à-dire ce que vous avez Devrait attendre ) d'abord. Vous avez besoin de quelque chose sur attendre avant faire votre code asynchrone.

vous devrait utiliser attendre si vous avez des travaux naturellement asynchrones à faire. Ceci est généralement basé sur des I / O, donc si vous appelez une API ou si vous faites une requête de base de données, ce serait quelque chose qui peut être rendu asynchrone. Une fois que vous avez identifié l'appel d'E / S à bas niveau, modifiez la méthode pour appeler la version asynchrone de cette API et ajouter un attendre . Le compilateur vous guidera à partir de là, modifiant la méthode contenant le attendre pour être async et modifier son type de retour à partir de vide à Tâche ou t à tâche . Ensuite, Laissez async / attendre se développer naturellement via votre codebase .


0 commentaires