Est Asynchrone mot clé await équivalent à un 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 à présent 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"));
Vous devez vous connecter pour publier un commentaire.
L'idée générale est correcte - le reste de la méthode est en fait une continuation de toutes sortes.
La "fast path" post de blog a des détails sur la façon dont le
async
/await
compilateur travaux de transformation.Différences, sur le dessus de ma tête:
La
await
mot-clé permet également l'utilisation d'une "planification d'contexte" concept. La programmation, le contexte estSynchronizationContext.Current
si elle existe, pour retomber surTaskScheduler.Current
. La poursuite est alors exécuté sur la planification de contexte. Donc une approximation plus proche serait de passerTaskScheduler.FromCurrentSynchronizationContext
enContinueWith
, pour retomber surTaskScheduler.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 commeYield
, 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.Un plus mineur pinailleurs différence vient à l'esprit: si le awaitable est déjà terminée, le
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 passerTaskContinuationOptions.ExecuteSynchronously
, mais sans la pile de problèmes liés à l'.Connect
méthode a déclenché une exception au sein de la Fpo code? SeraitContinueWith
toujours être déclenché dans ce cas? Et si oui, est-il une meilleure approche pour obtenir des que comportement à l'aide de seulementasync
/await
? Je veux exécuter deux tâches, l'une après l'autre, et je ne m'inquiète pas si le premier lève une exception, le deuxième doit toujours exécuter. AFAICT, si je suis allé avec l'attend, j'aurais à traiter explicitement des exceptions et de créer le total exception.Connect
jeta unSpecificException
, puis leContinueWith
à l'exécution; un accès à laResult
propriété poserait unAggregateException
emballage de laSpecificException
. L'exception serait alors ignoré.I want to run two tasks one after the other, and I don't care if the first one throws an exception, the second should always run.
Il ya une tendance pour que:try { await first(); } finally { await second(); }
qui travaille pour le C#6 / VS2015, mais sur VS2013, vous auriez àtry { await first(); } catch { } await second();
.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://codeblog.jonskeet.uk/category/eduasync/
En particulier, post #7 pénètre dans ce qui est généré (comme de la CTP 2) et pourquoi, alors, probablement, un ajustement parfait pour ce que vous êtes à la recherche pour le moment:
http://codeblog.jonskeet.uk/2011/05/20/eduasync-part-7-generated-code-from-a-simple-async-method/
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://codeblog.jonskeet.uk/2011/05/30/eduasync-part-9-generated-code-for-multiple-awaits/