Tôi đã vấp phải điều này với cùng một câu hỏi trong đầu, nhưng sau khi đọc các câu trả lời, câu hỏi dường như kéo dài, bối rối bởi các tham chiếu đến "ma thuật dưới mui xe".
Từ lập trình không đồng bộ đã đề cập ở trên :
- Các
async
từ khóa biến một phương pháp thành một phương pháp async, cho phép bạn sử dụng các await
từ khóa trong cơ thể của nó.
- Khi
await
từ khóa được áp dụng, nó tạm dừng phương thức gọi và mang lại quyền kiểm soát cho người gọi cho đến khi nhiệm vụ được chờ hoàn thành.
await
chỉ có thể được sử dụng bên trong một async
phương thức.
Liệu bối cảnh gặp phải await
có bị chặn?
- Có . Đó thực chất là một rào cản đồng bộ hóa cục bộ để duy trì trạng thái đã biết trong bối cảnh thực thi; ngoại trừ các bối cảnh khác, nếu có, không được tham gia.
Có phải phần còn lại của khối ứng dụng tại await
?
Nó phụ thuộc vào cách ứng dụng của bạn được viết. Nếu đó là một loạt các await
tác vụ ed phụ thuộc được khởi chạy tuần tự trong cùng một bối cảnh (xem: Cố gắng hiểu một số hành vi không đồng bộ / chờ đợi )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
Bằng cách này, mỗi cái await
sẽ chặn sinh sản của cái tiếp theo.
Mặt khác, các tác vụ phụ thuộc tương tự được khởi chạy song song sẽ thực thi song song và bối cảnh sẽ chỉ chặn ở mức tương ứng. await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
Nói chung, việc await
thực hiện mang lại cho bối cảnh bên ngoài, từ đó bối cảnh hiện tại được gọi. Tuy nhiên, nếu bối cảnh bên ngoài đang chờ đợi hiện tại, thì nó giống như một chuỗi liên tiếp await
trong cùng bối cảnh.
Vì vậy, để gặt hái những async
lợi ích, người ta cần thiết kế ứng dụng để chạy một số bối cảnh song song (UI, data-client, v.v.), sau đó await
trong một bối cảnh mang lại sự thực thi cho các bối cảnh khác, vì vậy toàn bộ ứng dụng sẽ không chặn trên một cá nhân await
.