Quel est le nouveau C# attendent fonctionnalité?
Quelqu'un peut-il expliquer ce qu'est l' await
fonction n'?
- Est-ce cela que vous faites référence? la Programmation Asynchrone en C# 5.0 partie deux: d'Où l'attendent?
- Voir aussi la Programmation Asynchrone avec Async et Await
- Nice exemples aussi dans le dotnetperls.com/async.
- Je ne crois pas que cette question est trop vaste ou devrait être fermé. Elle demande ce qu'un mot clé. (C'était une version antérieure différent?)
Vous devez vous connecter pour publier un commentaire.
Ils ont juste parlé au PDC hier!
Attendent est utilisé en conjonction avec des Tâches de programmation parallèle) dans .NET. C'est un mot-clé étant introduite dans la prochaine version de .NET. Il est plus ou moins permet de "suspendre" l'exécution d'une méthode permettant d'attendre la Tâche à achever l'exécution. Voici un bref exemple:
await
ne fait pas une pause quoi que ce soit, il s'enroule le repos ou la méthode de la poursuite de la tâche siTask
attendue est toujours en cours d'exécution.Fondamentalement, la
async
etawait
mots-clés vous permettent de spécifier que l'exécution d'une méthode doit s'arrêter à tous les usages deawait
, qui marque asynchrone appels de méthode, et de reprendre ensuite une fois l'opération asynchrone est terminée. Cela vous permet d'appeler une méthode dans une application thread principal et la poignée complexe de travailler de manière asynchrone, sans la nécessité de définir de manière explicite les threads et les jointures ou de blocage de l'application du thread principal.Pensez à cela comme quelque peu semblable à une
yield return
déclaration d'une méthode de production d'un IEnumerable. Lorsque le moteur d'exécution frappe leyield
, il va enregistrer la méthode de l'état actuel, et de renvoyer la valeur de référence ou être donné. La prochaine fois IEnumerator.MoveNext() est appelée sur l'objet de retour (qui est généré en interne par le moteur d'exécution), la méthode de l'ancienne restauration de l'état de la pile et l'exécution se poursuit à la ligne suivante après layield return
comme si nous n'avions jamais quitté la méthode. Sans ce mot-clé, un IEnumerator type doit être personnalisés pour stocker et gérer l'itération des demandes, avec des méthodes qui peuvent devenir TRÈS complexe en effet.De même, une méthode marquée comme
async
doit avoir au moins unawait
. Sur unawait
, le runtime enregistrer le thread courant de l'état et de la pile d'appel, faire l'appel asynchrone, et détendez-vous en arrière pour l'exécution de la boucle de message pour gérer le message suivant et garder l'application réactive. Lors de l'opération asynchrone est terminée, lors de la prochaine planification occasion, la pile d'appel de l'opération asynchrone est poussé en arrière et a continué comme si l'appel est synchrone.Donc, ces deux nouveaux mots-clés essentiellement de simplifier le codage des processus asynchrones, comme
yield return
simplifié de la génération de la coutume enumerables. Avec un couple de mots-clés et un peu de connaissances de base, vous pouvez ignorer tout ce qui prête à confusion et souvent sujette à des erreurs, des détails traditionnels du modèle asynchrone. Ce sera d'une aide INESTIMABLE dans pratiquement n'importe quel event-driven " GUI application comme Winforms, WPF de Silverlight.Actuellement accepté réponse est trompeuse.
await
n'est pas mise en pause de quoi que ce soit.Tout d'abord, il peut être utilisé seulement dans les méthodes ou les lambdas marqué comme
async
et le retourTask
ouvoid
si vous ne vous souciez pas d'avoirTask
instance en cours d'exécution dans cette méthode.Voici une illustration:
De sortie:
await
n'arrête pas de rien, mais il est logique de penser qu'il n'. La accepté de répondre a une pause entre guillemets, ce qui implique qu'il n'est pas vrai, c'est juste une façon de penser sur ce qui se passe. Je dirais que c'est pas vraiment un problème, mais ce n'est certainement pas bien expliqué. Comme pour ne pas être dans une méthode marquéeasync
, au moment que le post a été écrit à la fonction n'avait pas encore été publié, et la syntaxe pour qu'il ne l'avait même pas encore été inventé. Expliquant la syntaxe maintenant qu'il a est très bien, il suffit de comprendre pourquoi il n'est pas dans cette réponse.Thread.Sleep
dans votre tâche asynchrone? Vous ne devriez vraiment pas être à l'aide d'une méthode de blocage comme ça. Il devrait être remplacé parawait Task.Delay(X000);
au lieu de cela, sauf si vous essayez de démontrer quelque chose en les incluant, dans ce cas, veuillez expliquer ce que vous essayez de montrer en mélangeant asynchrone et non des opérations asynchrones dans la méthode.Sleep
pour indiquer que, quelque chose comme "espace réservé pour de vrai travail" ou quelque chose comme ça. Aussi, si vous avez des CPU, des travaux qui seront exécutés pendant 3 secondes (la première de sommeil), il ne devrait pas être dans le contexte actuel, il devrait être à l'intérieur d'unawait Task.Run(...
comme l'exemple suivant.await
sur? De sens que si cela est appelé à partir d'un thread d'INTERFACE utilisateur il permet de bloquer le thread d'INTERFACE utilisateur pour 3 secondes? L'idée de ce modèle est d'éviter de faire des choses comme ça.Task
, appelant attend la méthode asynchrone de ne pas bloquer. Donc, unThread.Sleep()
comme l'action dans une méthode asynchrone est en fait juste une mauvaise conception. Si vous avez une méthode asynchrone, vous devez vous assurer qu'il est en fait asynchrone. C'est la mainTask
à l'appelant sans blocage.Pour quelqu'un de nouveau à la programmation asynchrone en .NET, voici un (totalement faux) analogie dans le cas, vous êtes peut-être plus familiers avec les appels AJAX à l'aide de JavaScript/jQuery. Un simple jQuery AJAX post ressemble à ceci:
La raison pour laquelle nous traiter les résultats dans une fonction de rappel est afin de ne pas bloquer le thread courant en attendant l'appel AJAX de retour. Seulement quand la réponse est prêt va le rappel de me faire virer, de libérer le thread en cours pour faire d'autres choses dans le temps de le dire.
Maintenant, si JavaScript soutenu la
await
mot-clé (qui, bien sûr, il n'a pas (encore!)), vous pouvez obtenir la même chose avec cela:C'est beaucoup plus clair, mais il semble vraiment comme nous avons introduit synchrone, le blocage de code. Mais le (faux) compilateur JavaScript aurait tout pris après
await
et câblé dans un rappel, donc, au moment de l'exécution le deuxième exemple, se comportent exactement comme la première.Il peut ne pas sembler comme il vous sauver beaucoup de travail, mais quand il s'agit de choses comme la gestion des exceptions et la synchronisation des contextes, le compilateur est en train de faire une beaucoup de levage lourd pour vous. Pour en savoir plus, je vous recommande la Faq suivie par Stephen Cleary le blog de la série.
Si j'avais à le mettre en œuvre en Java, il ressemblerait à quelque chose comme ceci:
Votre application utilise comme ceci: