Có thể ai đó vui lòng xác nhận xem tôi có hiểu từ khóa Async đang chờ chính xác không? (Sử dụng phiên bản 3 của CTP)Là Async đang chờ từ khóa tương đương với một ContinueWith lambda?
Vì vậy, đến nay tôi đã tìm ra rằng chèn từ khóa chờ đợi trước một cuộc gọi phương thức về cơ bản là 2 điều, A. Nó tạo ra lợi tức ngay lập tức và B. Nó tạo ra một "sự tiếp tục" được gọi khi hoàn thành lời gọi phương thức async. Trong mọi trường hợp, việc tiếp tục là phần còn lại của khối mã cho phương thức. Vì vậy, điều tôi đang phân vân là hai bit mã tương đương về mặt kỹ thuật, và nếu vậy, điều này về cơ bản có nghĩa là từ khóa chờ đợi giống hệt nhau để tạo ra một ContinueWith Lambda (Tức là: nó là một trình biên dịch cơ bản cho một) ? Nếu không, sự khác biệt là gì?
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ất hay nói - Tôi cố gắng trì hoãn các bài đăng của Jon vì chúng rộng hơn nhiều so với bất cứ điều gì tôi có thời gian để trả lời về SO, nhưng Stephen hoàn toàn đúng. WRT những gì đang chờ đợi (và GetAwaiter nói riêng), bài đăng của anh ấy # 3 rất hữu ích IMHO :) http://msmvps.com/blogs/jon_skeet/archive/2011/05/13/eduasync-part-3-the-shape- of-the-async-method-awaitable-boundary.aspx –
Điểm của Stephen ở đây. Đối với các ví dụ đơn giản, thật dễ dàng để nghĩ rằng async/await chỉ là một phím tắt cho ContinueWith - tuy nhiên, tôi thích nghĩ về nó ngược lại. Async/await thực sự là một biểu hiện mạnh mẽ hơn về những gì bạn sử dụng để sử dụng ContinueWith cho. Vấn đề là ContinueWith (...) sử dụng lambdas, và cho phép thực hiện để được chuyển sang tiếp tục, nhưng các khái niệm luồng điều khiển khác như vòng lặp là không thể nếu bạn phải đặt một nửa của vòng lặp trước ContinueWith (.. .) và nửa kia sau. Bạn kết thúc với chuỗi liên tục thủ công. –
Một ví dụ khác khi không đồng bộ/chờ đợi diễn đạt hơn nhiều so với ContinueWith (...) đang chảy ngoại lệ. Bạn có thể chờ đợi nhiều lần trong cùng một khối thử và cho mỗi giai đoạn thực hiện, ngoại lệ của chúng có thể được chuyển vào cùng một khối catch (...) mà không cần phải viết tấn mã làm điều đó một cách rõ ràng. –