Trong một số mã máy chủ tcp không đồng bộ mà tôi có, đôi khi xảy ra lỗi khiến quá trình tiêu thụ toàn bộ bộ nhớ của hệ thống. Khi xem nhật ký, trình xem sự kiện và số MS docs vấn đề xảy ra nếu "ứng dụng gọi điện làm cho cuộc gọi IO không đồng bộ đến cùng một máy khách nhiều lần thì bạn có thể thấy phân mảnh heap và tăng byte riêng nếu ứng dụng khách từ xa dừng kết thúc I/O "dẫn đến việc tăng mức sử dụng bộ nhớ và ghim của các mảng cấu trúc và mảng byte System.Threading.OverlappedData.Cách tắt mã tcp không đồng bộ .NET sử dụng hết tài nguyên của hệ thống
Giải pháp đề xuất của bài viết KB là "đặt giới hạn trên cho số 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."
Làm cách nào để thực hiện việc này? Đây có phải là tham chiếu đến byte [] được gửi vào BeginRead không? Vì vậy, là giải pháp chỉ đơn giản là gói byte truy cập [] với một semaphore?
EDIT: Truy cập được kiểm soát bằng semaphore tới bộ đệm byte hoặc chỉ có bộ đệm byte có kích thước tĩnh là hai giải pháp phổ biến. Một vấn đề mà tôi vẫn còn tồn tại là khi vấn đề máy khách không đồng bộ này xảy ra (có thể đó là một sự kiện mạng lạ), có các semaphores hoặc các vùng đệm byte sẽ ngăn tôi thoát khỏi bộ nhớ, nhưng nó không giải quyết được vấn đề. Hồ bơi của tôi về bộ đệm sẽ có khả năng nhận được gobbled lên của khách hàng vấn đề (s), có hiệu lực khóa chức năng chính xác khách hàng hợp pháp ra ngoài.
CHỈNH SỬA 2: Đến đây tuyệt vời answer. Về cơ bản nó cho thấy làm thế nào để tự unpin đối tượng. Và trong khi mã TCP không đồng bộ rời khỏi các quy tắc thời gian chạy hậu trường, có thể ghi đè bằng cách ghim chặt chẽ từng bộ đệm trước khi sử dụng, sau đó bỏ ghim ở cuối khối hoặc cuối cùng. Tôi đang cố gắng tìm ra điều đó ngay bây giờ ...
Có thể trùng lặp: http://stackoverflow.com/questions/236171/net-does-not-have-reliable-asynchronouos-socket-communication – Dennis
Đó là về gói gọi đến BeginRead với semaphore. – mikalai
Có lẽ đây là lý do chính đáng để cấu hình mã ... – gsscoder