Tôi có một ứng dụng web ASP.NET MVC làm cho các cuộc gọi dịch vụ web kiểu REST trở thành các máy chủ khác. Tôi có một kịch bản mà tôi đang thực hiện hai cuộc gọi HttpWebRequest đến hai dịch vụ riêng biệt. Tôi cần cả hai để hoàn thành để tiếp tục, nhưng thứ tự của họ không quan trọng. Họ có thể mất 1-2 giây và tôi đang chạy chúng theo trình tự bây giờ. Chạy song song sẽ làm giảm thời gian phản hồi của người dùng, nhưng cách tốt nhất là gì?Các khuyến nghị để thực hiện .NET HttpWebRequests song song trong ASP.NET
Trong nghiên cứu này, tôi có thể nghĩ đến một vài lựa chọn:
- Execute một yêu cầu về các chủ đề chính, và quay lên một sợi thứ hai cho các yêu cầu khác. Nên tạo chủ đề mới hoặc sử dụng một hồ bơi thread? Nếu tôi sử dụng một hồ bơi, làm thế nào để tôi kích thước nó? Ngoài ra, không chắc chắn làm thế nào tôi có thể tham gia các chủ đề lại với nhau (ví dụ: sử dụng ThreadPool.RegisterWaitForSingleObject)?
- Hãy thử và tận dụng hỗ trợ IAsyncResult được tích hợp sẵn cho một hoặc cả hai yêu cầu. Một lần nữa, không chắc chắn về chủ đề mà yêu cầu async thực hiện, vì vậy không chắc chắn làm thế nào để kích thước hồ bơi thread. Làm thế nào để tôi tham gia IAsyncResult trở lại chủ đề chính của tôi? Tất cả các ví dụ tôi tìm thấy thông tin quá trình trong gọi lại, nhưng tôi chỉ có thể chờ đợi trong chủ đề chính của tôi và sử dụng tài sản IsCompleted?
Tôi cần tìm giải pháp vừa hoạt động vừa thực hiện trên quy mô lớn. Đó là lý do tại sao tôi lo lắng về kích thước hồ bơi thread. Tôi ghét phải yêu cầu chặn vì họ đang chờ các chủ đề có sẵn.
Hmmm, tôi nghĩ việc chờ đợi mà bạn có trong mã giả (trong khi (đúng)) chỉ phù hợp với thời gian chờ đợi rất ngắn. Tôi nghĩ rằng bạn muốn sử dụng một số loại semaphore thay thế. – Mike
Ông đã nói đây là ứng dụng ASP.NET MVC, vì vậy tôi sẽ giả định rằng thời gian chờ đợi nói chung sẽ khá ngắn. Khi bạn nói semaphore tôi không chắc chắn bối cảnh bạn đang đề cập đến như một semaphore sẽ hoạt động chính xác như một spin-lock (thời gian CPU sans có thể được khắc phục trong mã nhanh ở trên) và vẫn yêu cầu một vòng lặp tương tự như ở trên để phát hành khóa vì chúng ta đang xử lý nhiều luồng. – GrayWizardx