Tôi đã dành hầu hết năm mã hóa năm ngoái trong Silverlight, điều đó có nghĩa là tôi đã dành rất nhiều thời gian suy nghĩ (và chiến đấu cùng) cùng các vấn đề bạn mô tả.
Tóm lại, như những người khác đã chỉ ra, sức mạnh thực sự đối với mô hình không đồng bộ là khả năng tạo ra các hệ thống mạnh mẽ tương thích tốt với thế giới thực. Không ai thực sự có thể sử dụng ứng dụng Silverlight (hoặc Flash) nếu chuỗi giao diện người dùng bị tạm dừng mỗi lần mất một vài giây để cuộc gọi dịch vụ web trở lại.
Nhược điểm lớn nhất là mã kết quả là phức tạp và khó khắc phục. Những thứ như xử lý lỗi là một PITA, nhưng những thứ khó chịu nhất mà tôi phải đối phó là điều phối các phản hồi từ nhiều cuộc gọi không đồng bộ. Nếu bạn cần thông tin từ cuộc gọi A trước khi thực hiện cuộc gọi B và bạn cần thông tin từ cuộc gọi B trước khi thực hiện cuộc gọi C (và vv), mã kết quả trông thực sự khó chịu và dễ bị tất cả các loại tác dụng phụ lạ . Có những kỹ thuật để làm cho tất cả các công cụ này hoạt động, và thậm chí hợp lý sạch sẽ, nhưng nếu bạn đến từ thế giới đồng bộ (như tôi), đó là một đường cong học tập quan trọng. (Và nó không giúp Microsoft đẩy các sự kiện như là cách để đối phó với các cuộc gọi WCF khi gọi lại, theo ý kiến của tôi, là sạch hơn và ít nhạy cảm với các loại tác dụng phụ lạ mà tôi đã nói đến.)
(Và vâng, folks khác là chính xác khi nói rằng nó không phải là ngôn ngữ đó là không đồng bộ rất nhiều như các khuôn khổ đặc biệt đòi hỏi phải xây dựng mã của bạn một cách không đồng bộ -. Nhưng tôi có được những gì bạn có ý nghĩa)
Cập nhật 2014.09.23 -
Tôi đã thực hiện nhiều công việc hơn với nhiều khung công tác không đồng bộ kể từ khi tôi viết câu trả lời ở trên (có lẽ mọi người đã thực hiện bất kỳ mã hóa web nào) và nghĩ rằng tôi sẽ thêm một vài ghi chú ngẫu nhiên bổ sung:
Nếu bạn đang sử dụng một ngôn ngữ như C# hoặc F # có hỗ trợ không đồng bộ hạng nhất, rất nhiều điều này sẽ dễ dàng hơn rất nhiều, ít nhất, khi bạn quấn đầu quanh các mẫu async
/await
kỳ lạ. Có thể lặp lại dễ dàng xung quanh các cuộc gọi không đồng bộ, và quấn toàn bộ điều với một đơn giản try/catch
, là tuyệt vời nếu bạn đã từng phải làm điều đó theo cách cũ.
Nếu bạn không sử dụng một ngôn ngữ với sự hỗ trợ async hạng nhất, bắt đầu sử dụng bất cứ điều gì promise
hoặc future
hoặc task
hỗ trợ mà ngôn ngữ không cung cấp (ví dụ, JQuery $.Deferred()
, hoặc góc của $q.defer()
. Đó là rất nhiều bụi và cung cấp cấu trúc tốt hơn so với những gì bạn thường nhận được với các cuộc gọi lại
Mã không đồng bộ là rất quan trọng để viết các hệ thống phía máy chủ có thể mở rộng được. ít nhất, nó sẽ làm gì nếu nó dành một sợi chỉ để đạt được yêu cầu đến. chạy cuộc gọi đồng bộ để hoàn thành, nó hoàn toàn không có sẵn để giúp đỡ với bất cứ điều gì khác. Tốt hơn hết là làm cho mã máy chủ web của bạn không đồng bộ, để khi bạn đang chờ một cuộc gọi DB quay lại, luồng đó có thể đi dịch vụ nửa tá yêu cầu khác trong khi DB đang làm và làm bất cứ điều gì DB làm. Tại thời điểm này, đối với các hệ thống có khả năng mở rộng cao, async là trò chơi duy nhất trong thị trấn. (Chỉ cần hỏi bất kỳ người hâm mộ Node nào.)
Nguồn
2009-12-18 19:49:47
Ngôn ngữ có thể không đồng bộ như thế nào? –
@NSD - ý của ông là flex không bao giờ chặn - tất cả các hoạt động có thể chặn trên các nền tảng khác được triển khai một cách đồng bộ. – Grokys
Bạn có định nghĩa về "ngôn ngữ thực thi đồng bộ" không? Hay bạn chỉ đơn giản là giải thích bản chất của sự kiện theo định hướng của Flex (cũng được tìm thấy trong hầu hết các GUI API khác, bao gồm cả Java) là "không đồng bộ"? – kdgregory