Czy ktoś mógłby być na tyle uprzejmy, aby potwierdzić, czy poprawnie zrozumiałem słowo kluczowe Async? (Używając wersji 3 CTP)Czy Async czeka na odpowiednik słowa kluczowego ContinueWith lambda?
Do tej pory doszedłem do wniosku, że wstawienie słowa kluczowego oczekującego przed wywołaniem metody zasadniczo powoduje 2 rzeczy, A. Tworzy natychmiastowy powrót i B. Tworzy "kontynuację", która jest wywoływana po zakończeniu wywołania metody asynchronicznej. W każdym razie kontynuacja jest pozostałą częścią bloku kodu dla metody.
Więc zastanawiam się, czy te dwa bity kodu są równoważne pod względem technicznym, a jeśli tak, czy to w zasadzie oznacza, że oczekiwane słowo kluczowe jest identyczne z tworzeniem ContinueWith Lambda (np. Jest to skrót kompilatora dla 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"));
bardzo dobrze powiedziane - staram się odkładać na posty Jona, ponieważ są one o wiele bardziej rozbudowane niż cokolwiek, co miałbym czas na odpowiedź na SO, ale Stephen ma absolutną rację. WRT, co jest godne uwagi (a zwłaszcza GetAwaiter), jego post # 3 jest bardzo pomocny IMHO :) http://msmvps.com/blogs/jon_skeet/archive/2011/05/13/eduasync-part-3-the-shape- metody-async-awaitable-boundary.aspx –
Miejsce Stephena na miejscu. Dla prostych przykładów łatwo pomyśleć, że async/await to skrót do ContinueWith - jednak lubię myśleć o tym na odwrocie. Async/await jest w rzeczywistości silniejszym wyrażeniem tego, do czego używałeś ContinueWith. Problem polega na tym, że ContinueWith (...) używa lambdas i pozwala na przeniesienie wykonania do kontynuacji, ale inne koncepcje sterowania, takie jak pętle, są całkiem niemożliwe, jeśli musisz umieścić połowę ciała pętli przed ContinueWith (.. .) a druga połowa po. Kończy się ręcznym łańcuchem kontynuacji. –
Kolejny przykład, w którym async/await jest znacznie bardziej ekspresyjny niż ContinueWith (...) przepływa przez wyjątki. Możesz oczekiwać wiele razy w tym samym bloku try, a dla każdego etapu wykonania, ich wyjątki mogą być kierowane do tego samego bloku catch (...) bez konieczności pisania ton kodu, który robi to jawnie. –