0
votes

Puis-je omettre "attendre" des clients.All.sendasync () dans .Net Core Signalr?

        public async Task GetLiveCandleStick(string param)
        {
            await Clients.All.SendAsync("ReceiveMessage", param);
        }
Please consider the above code.Almost all of the tutorial await Clients.xxx.SendAsync methods. However, I find that it works fine even I take away the await keyword. Then what is the point of using await? (I have seen a thread explaned that await is not meant to "wait until client receive the message...")Thanks in advance.

3 commentaires

Dans ce cas, vous n'avez pas besoin d'utiliser attendre


Jetez un coup d'œil à ceci: ASYNC et attendre "Je recommande de garder l'asynchrone et d'attendre des mots-clés, à l'exception de quelques scénarios."


Veuillez considérer ASP.NET Architect's (David Fowler) Suggestion aussi


3 Réponses :


0
votes

Le mot-clé "attendre" est pour les méthodes asynchronisées. C'est plus intelligent que "attendre", c'est ASYNC Attends! Cela signifie que attendre le retour du message lors de l'exécution du code jusqu'à ce que le résultat soit utilisé. Donc, vous n'avez pas besoin d'utiliser le thread.Wait dans une ligne de code, mais le compilateur place l'attente dans la bonne position. Dans ce cas, la méthode qui appelle l'Await est ASYNC, alors l'attente des clients.All.sendasync n'est pas hors de fonction.


1 commentaires

Ce n'est pas la question de la question. Étant donné que la méthode renvoie déjà une tâche et les résultats de sendasync ne sont pas utilisés, y a-t-il une raison pour attendre ? Il n'y a pas



3
votes

Dans ce cas seulement, vous n'avez pas besoin d'utiliser attendre code> - rien d'autre ne se passe après sendasync code> il n'y a donc pas besoin d'attendre. En attente sur getLivecandLestick code> se comporterait de la même manière que l'attente de sendasync code>. Vous pouvez convertir cette méthode à:

public Task GetLiveCandleStick(string param)=> Clients.All.SendAsync("ReceiveMessage", param);


2 commentaires

Il est également important que rien ne se passe avant sendasync . En supprimant le mot-clé async , toutes les exceptions qui sont lancées avant SendAsync sont appelées directement plutôt que d'être placées sur la tâche .


Merci @Panagiotis Kanavos, puis-je savoir ce qui va signaler pour en faire un message? S'il ne s'agit que d'une file d'attente de message ajoute une action, il n'y a aucune raison de faire est une tâche ... et qu'est-ce que nous attendons en utilisant cette fonction avec un attendre ?



3
votes

en omettant le mot-clé attendre , la méthode deviendrait incendie et oublier; Ce n'est presque jamais la bonne chose à faire, car vous n'auriez aucun moyen de savoir que la tâche avait terminé.

Un autre problème est la manipulation des exceptions. Si une exception se produit lorsque vous appelez sendasync , il est placé sur la tâche plutôt que d'être jeté directement, et serait simplement des déchets recueillis sans utiliser attendre .

ayant dit cela, si votre méthode getLivecandLestick est une simple emballage comme vous le suggérez, il serait légèrement plus efficace de renvoyer la tâche à partir de sendasync plutôt que de créer un nouveau sur async : xxx


4 commentaires

Merci @johnathan Barclay, vous le faites si clair ... mais j'ai toujours une incertitude ... Quelle est la moyenne par " tâche avait terminé"? Cela signifie-t-il que jusqu'à ce que le client ait reçu le message et acquitte le serveur? Ou tout simplement signifie simplement que le message a été envoyé?


@mannok à partir du docs the sendasync La méthode renvoie une tâche qui complète lorsque le message a été envoyé sur le serveur. . Aucune valeur de retour n'est fournie depuis que cette tâche n'attend pas que la méthode du serveur se termine.


@Mannok Aussi: Toutes les exceptions prévues sur le client lors de l'envoi du message produisent une tâche erronée. Utilisez attendre et essayer ... Catch Syntaxe pour gérer les erreurs d'envoi.


Oui, bon point sur la manipulation des erreurs. Mais pour SendaSync, je ne l'obtiens toujours pas comme l'explication que vous avez fournie concerne le "serveur d'appel client", différent entre invoqueasync et sendasync est de savoir s'il faut attendre la méthode retour ou non. Que diriez-vous de «serveur appelant client»? c'est-à-dire quand clients.All.sendasync ("reçus", param) être "résolu"? c'est-à-dire une fois que le message atteint le client? Une fois la fonction client revenue? ou quoi que ce soit d'autre? Merci beaucoup