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 Réponses :
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. P>
Ce n'est pas la question de la question. Étant donné que la méthode renvoie déjà une tâche code> code> et les résultats de sendasync code> ne sont pas utilisés, y a-t-il une raison pour
attendre code>? Il n'y a pas
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);
Il est également important que rien ne se passe avant i> sendasync code>. En supprimant le mot-clé code> async code>, toutes les exceptions qui sont lancées avant
SendAsync code> sont appelées directement plutôt que d'être placées sur la tâche code>.
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 code>?
en omettant le mot-clé code> attendre code>, 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 Un autre problème est la manipulation des exceptions. Si une exception se produit lorsque vous appelez ayant dit cela, si votre méthode code> getLivecandLestick code> est une simple emballage comme vous le suggérez, il serait légèrement plus efficace de renvoyer la tâche code> avait terminé.
sendasync code>, il est placé sur la tâche code> code> plutôt que d'être jeté directement, et serait simplement des déchets recueillis sans utiliser
attendre code >. p>
code> à partir de
sendasync code> plutôt que de créer un nouveau sur
async code>: p>
Merci @johnathan Barclay, vous le faites si clair ... mais j'ai toujours une incertitude ... Quelle est la moyenne par " tâche code> 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 code> La méthode renvoie une tâche code> code> qui complète lorsque le message a été envoyé sur le serveur. . Aucune valeur de retour n'est fournie depuis que cette tâche
code> n'attend pas que la méthode du serveur se termine. I>
@Mannok Aussi: Toutes les exceptions prévues sur le client lors de l'envoi du message produisent une tâche erronée. Utilisez attendre code> et
essayer ... Catch code> Syntaxe pour gérer les erreurs d'envoi. I>
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 code> et
sendasync code> 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) code> ê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
Dans ce cas, vous n'avez pas besoin d'utiliser
attendre code>
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." I>
Veuillez considérer ASP.NET Architect's (David Fowler) Suggestion aussi