Czy ktoś mógłby być na tyle uprzejmy, aby potwierdzić, czy poprawnie zrozumiałem słowo kluczowe Async await? (Korzystanie z wersji 3 CTP)
Jak dotąd odkryłem, że wstawienie słowa kluczowego await przed wywołaniem metody zasadniczo robi dwie rzeczy: A. Tworzy natychmiastowy powrót i B. Tworzy „kontynuację”, która jest wywoływana po zakończeniu wywołania metody async. W każdym przypadku kontynuacja jest pozostałą częścią bloku kodu metody.
Zastanawiam się więc, czy te dwa bity kodu są technicznie równoważne, a jeśli tak, czy to w zasadzie oznacza, że słowo kluczowe await jest identyczne z tworzeniem ContinueWith Lambda (tj. Jest to w zasadzie skrót kompilatora do jednego)? Jeśli nie, jakie są różnice?
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"));
źródło
await
nadal przechwytujeSynchronizationContext.Current
tak, jak zawsze. Ale w ASP.NET CoreSynchronizationContext.Current
jestnull
.To jest „zasadniczo”, ale wygenerowany kod robi coś więcej niż tylko to. Aby uzyskać więcej szczegółów na temat wygenerowanego kodu, gorąco polecam serię Eduasync Jona Skeeta:
http://codeblog.jonskeet.uk/category/eduasync/
W szczególności post # 7 dotyczy tego, co jest generowane (od CTP 2) i dlaczego, więc prawdopodobnie świetnie pasuje do tego, czego szukasz w tej chwili:
http://codeblog.jonskeet.uk/2011/05/20/eduasync-part-7-generated-code-from-a-simple-async-method/
EDYCJA: Myślę, że będzie to bardziej szczegółowe niż to, czego szukasz w pytaniu, ale jeśli zastanawiasz się, jak wyglądają rzeczy, gdy masz wiele oczek w metodzie, omówiono to w poście nr 9 :)
http://codeblog.jonskeet.uk/2011/05/30/eduasync-part-9-generated-code-for-multiple-awaits/
źródło