2012-07-06 24 views
11

This comment bởi Stephen Cleary nói điều này:Đồng bộ hóa Asp.netBài viết tiếp theo HttpApplication for async continuations?

AspNetSynchronizationContext là việc thực hiện kỳ ​​lạ. Nó xử lý Post là đồng bộ thay vì không đồng bộ và sử dụng khóa để thực thi các đại biểu của nó cùng một lúc.

Tương tự, the article that he wrote on synchronization contexts và liên kết đến trong bình luận cho thấy:

Về mặt lý thuyết, bối cảnh AspNetSynchronizationContext rất phức tạp. Trong suốt vòng đời của một trang không đồng bộ, bối cảnh bắt đầu với chỉ một luồng từ nhóm chủ đề ASP.NET. Sau khi các yêu cầu không đồng bộ đã bắt đầu, ngữ cảnh không bao gồm bất kỳ chủ đề nào. Khi các yêu cầu không đồng bộ hoàn thành, các luồng thread pool thực thi các thường trình hoàn thành của chúng sẽ nhập vào ngữ cảnh. Đây có thể là các chủ đề tương tự mà bắt đầu các yêu cầu nhưng nhiều khả năng sẽ là bất kỳ chủ đề nào xảy ra miễn phí tại thời điểm các hoạt động hoàn tất.

Nếu nhiều thao tác hoàn thành cùng một lúc cho cùng một ứng dụng, AspNetSynchronizationContext sẽ đảm bảo rằng chúng thực thi một lần. Họ có thể thực hiện trên bất kỳ chủ đề nào, nhưng chuỗi đó sẽ có bản sắc và văn hóa của trang gốc.

Đào trong bộ phản xạ dường như xác thực điều này vì khóa cần khóa trên HttpApplication khi gọi bất kỳ cuộc gọi lại nào.

Khóa đối tượng ứng dụng có vẻ như nội dung đáng sợ. Vì vậy, câu hỏi đầu tiên của tôi: Điều đó có nghĩa là ngày nay, tất cả các lần hoàn thành không đồng bộ cho toàn bộ ứng dụng thực thi một lần, ngay cả những ứng dụng bắt nguồn từ các yêu cầu riêng biệt trên các luồng riêng biệt với HttpContexts riêng biệt? Đây không phải là một nút cổ chai lớn đối với bất kỳ ứng dụng nào làm cho việc sử dụng 100% các trang không đồng bộ (hoặc các bộ điều khiển không đồng bộ trong MVC)? Nếu không, tai sao không? Tôi đang thiếu gì?

Ngoài ra, trong .NET 4.5, có vẻ như có một AspNetSynchronizationContext mới và tên cũ được đổi tên thành LegacyAspNetSynchronizationContext và chỉ được sử dụng nếu cài đặt ứng dụng mới UseTaskFriendlySynchronizationContext không được đặt. Vì vậy, câu hỏi # 2: Việc thực hiện mới có thay đổi hành vi này không? Nếu không, tôi hình dung với sự hỗ trợ marshaling async/await mới hoàn thành thông qua bối cảnh đồng bộ hóa, loại nút cổ chai này sẽ được chú ý nhiều hơn trong tương lai.

Câu trả lời cho this forum post (được liên kết từ câu trả lời SO here) gợi ý rằng điều gì đó về cơ bản đã thay đổi ở đây, nhưng tôi muốn rõ ràng về điều gì và hành vi nào đã được cải thiện, vì chúng tôi có ứng dụng .NET 4 MVC 3 khá nhiều phương pháp hành động async 100% thực hiện các cuộc gọi dịch vụ web.

+0

Tôi nghi ngờ hành vi hiện tại được coi là "đủ tốt". Hãy nhớ rằng bản thân các hoạt động không đồng bộ là độc lập; nó chỉ là thói quen hoàn thành của họ (và tiếp tục) được đồng bộ hóa. Ngoài ra, các trang không đồng bộ là khó trước 4.5; hầu hết các ứng dụng ASP.NET hiện đang có đồng bộ. –

+0

Và tôi đã không có cơ hội để kiểm tra các synccontext ASP.NET mới. Chỉ cần có 4.5 với VS2012RC cài đặt cuối tuần qua, trên thực tế! Nhưng tôi sẽ trả lời ở đây cuối cùng nếu không ai khác làm. –

+0

Làm ơn. Bạn sẽ là một trong những nguồn có thẩm quyền nhất về chủ đề này. –

Trả lời

10

Hãy để tôi trả lời câu hỏi đầu tiên của bạn. Trong giả định của bạn, bạn đã không xem xét thực tế là các yêu cầu ASP.NET riêng biệt được xử lý bởi các đối tượng HttpApplication khác nhau. HttpApplication đối tượng được lưu trữ trong hồ bơi. Một khi bạn yêu cầu một trang, một đối tượng ứng dụng được lấy ra từ pool và thuộc về yêu cầu cho đến khi nó hoàn thành.Vì vậy, câu trả lời của tôi cho câu hỏi của bạn:

tất cả hoàn tất đồng bộ cho toàn bộ ứng dụng thực hiện cùng một lúc, ngay cả những người có nguồn gốc từ các yêu cầu riêng về chủ đề riêng biệt với HttpContexts riêng

là: Không, họ không

Yêu cầu riêng biệt được xử lý bởi các đối tượng HttpApplication riêng biệt, khóa HttpApplication sẽ chỉ ảnh hưởng đến yêu cầu duy nhất. Ngữ cảnh đồng bộ hóa là một điều mạnh mẽ giúp các nhà phát triển đồng bộ hóa quyền truy cập vào các tài nguyên được chia sẻ (trong phạm vi yêu cầu). Đó là lý do tại sao tất cả các cuộc gọi lại được thực hiện dưới khóa. Ngữ cảnh đồng bộ hóa là một trái tim của mẫu đồng bộ hóa dựa trên sự kiện.

+0

Sự trớ trêu là tôi mới nhận ra điều này sáng nay trên đường đi làm trong khi cân nhắc http://stackoverflow.com/questions/9413585/do-asynchronous-httpapplication-events-wait-until-they-return/11731051#11731051. Câu trả lời của bạn về HttpApplication riêng cho mỗi yêu cầu là hoàn toàn chính xác. Cảm ơn vì sự thấu hiểu. –

Các vấn đề liên quan