84 votes

Async wait est-il équivalent au mot clé ContinueWith lambda?

Quelqu'un pourrait-veuillez avoir l'amabilité de confirmer si j'ai bien compris la Async mot clé await correctement? (À l'aide de la version 3 de la CTP)

Donc ici, je n'ai travaillé que d'insérer le mot clé await avant un appel de méthode essentiellement 2 choses, A. Il crée un retour immédiat et B. Il crée une "suite" qui est appelée à la fin de la méthode async invocation. En tout cas, la suite est le reste du bloc de code pour la méthode.

Alors ce que je demande, ce sont ces deux bouts de code techniquement équivalent, et si oui, est-ce fondamentalement signifie que le mot clé await est identique à la création d'un ContinueWith Lambda (c'est à dire: c'est en fait un compilateur de raccourci pour une)? Si non, quelles sont les différences?

bool Success =
    await new POP3Connector(
        "mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");

VS

(new POP3Connector(
    "mail.server.com", txtUsername.Text, txtPassword.Text ).Connect())
.ContinueWith((success) =>
    MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));

86voto

Stephen Cleary Points 91731

L'idée générale est correcte - le reste de la méthode est en fait une continuation de toutes sortes.

La "voie rapide" post de blog a des détails sur la façon dont l' async/await compilateur travaux de transformation.

Les différences, sur le dessus de ma tête:

L' await mot-clé permet également l'utilisation d'une "planification d'contexte" concept. La programmation, le contexte est - SynchronizationContext.Current si elle existe, pour retomber sur TaskScheduler.Current. La poursuite est alors exécuté sur la planification de contexte. Donc une approximation plus proche serait de passer TaskScheduler.FromCurrentSynchronizationContext en ContinueWith, pour retomber sur TaskScheduler.Current si nécessaire.

Le réel async/await mise en œuvre est basée sur le pattern matching; il utilise un "awaitable" pattern qui permet à d'autres choses en plus de tâches à être attendu. Quelques exemples sont le WinRT des Api asynchrones, des méthodes un peu spéciales telles que Yield, Rx observables, et prise spéciale awaitables qui ne touche pas la table comme dur. Les tâches sont puissants, mais ils ne sont pas la seule awaitables.

Encore une mineure pinailleurs différence vient à l'esprit: si le awaitable est déjà terminé, alors l' async méthode ne permet pas réellement de retour à ce point, qu'il continue de façon synchrone. Donc c'est un peu comme passer TaskContinuationOptions.ExecuteSynchronously, mais sans la pile de problèmes liés à l'.

9voto

James Manning Points 7989

C'est "essentiellement", mais le code généré n'a strictement plus que cela. Pour beaucoup plus de détails sur le code généré, je vous conseille de Jon Skeet est Eduasync série

http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx

En particulier, post #7 pénètre dans ce qui est généré (CTP 2) et pourquoi, alors, probablement, un ajustement parfait pour ce que vous êtes à la recherche pour le moment:

http://msmvps.com/blogs/jon_skeet/archive/2011/05/20/eduasync-part-7-generated-code-from-a-simple-async-method.aspx

EDIT: je pense que c'est probablement plus de détails que ce que vous recherchez à partir de la question, mais si vous vous demandez ce que les choses ressembler lorsque vous avez plusieurs attend dans la méthode, c'est contenue dans le post #9 :)

http://msmvps.com/blogs/jon_skeet/archive/2011/05/30/eduasync-part-9-generated-code-for-multiple-awaits.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X