Tôi từng viết một Trình thu thập thông tin trong .NET. Để cải thiện khả năng mở rộng của nó, tôi đã cố gắng tận dụng API không đồng bộ của .NET..NET KHÔNG CÓ Giao tiếp Socket Asynchronouos đáng tin cậy?
System.Net.HttpWebRequest có API không đồng bộ BeginGetResponse/EndGetResponse. Tuy nhiên, cặp API này chỉ để nhận tiêu đề phản hồi HTTP và phiên bản Luồng từ đó chúng tôi có thể trích xuất nội dung phản hồi HTTP. Vì vậy, chiến lược của tôi là sử dụng BeginGetResponse/EndGetResponse để nhận được luồng phản hồi một cách không đồng bộ, sau đó sử dụng BeginRead/EndRead để nhận không đồng bộ các byte từ thể hiện Luồng phản hồi.
Mọi thứ có vẻ hoàn hảo cho đến khi Trình thu thập thông tin kiểm tra căng thẳng. Dưới kiểm tra căng thẳng, trình thu thập thông tin bị sử dụng bộ nhớ cao. Tôi đã kiểm tra bộ nhớ với WinDbg + SoS và tiết lộ rằng rất nhiều mảng byte được pined bởi System.Threading.OverlappedData trường hợp. Sau một số tìm kiếm trên internet, tôi tìm thấy KB http://support.microsoft.com/kb/947862 này từ microsoft.
Theo KB, số I/O không đồng bộ phải có "giới hạn trên", nhưng nó không cho biết giá trị giới hạn "được đề xuất". Vì vậy, trong mắt tôi, KB này không giúp gì cả. Đây rõ ràng là một lỗi .NET. Cuối cùng, tôi phải bỏ ý tưởng để thực hiện giải nén byte không đồng bộ từ luồng phản hồi và chỉ thực hiện theo cách đồng bộ.
Thư viện .NET cho phép Asynchronous IO với dấu chấm socket ròng (Socket.BeginSend/ Socket.BeginReceive/ NetworkStream.BeginRead/ NetworkStream.BeginWrite) phải có một ràng buộc trên vào lượng bộ đệm nổi bật (gửi hoặc nhận) với IO không đồng bộ của chúng.
Ứng dụng mạng phải có giới hạn trên trên số lượng xuất sắc IO không đồng bộ mà nó đăng.
Chỉnh sửa: Thêm một số dấu hỏi.
Bất kỳ ai có bất kỳ trải nghiệm nào để thực hiện I/O không đồng bộ trên Socket & NetworkStream? Nói chung, trình thu thập thông tin trong sản xuất có làm I/O với Internet có Đồng bộ hoặc Không đồng bộ không?
Không phải là dấu hỏi sigle ngoại trừ trong chủ đề ... Dấu hiệu xấu. –