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.
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ộ. –
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. –
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. –