Đối với phương thức System.Net.Sockets.Socket.AcceptAsync
của C# và .NET, một phương pháp sẽ được yêu cầu để xử lý giá trị trả lại là "sai" để xử lý trạng thái sẵn có ngay lập tức SocketAsyncEventArgs
từ kết nối được xử lý đồng bộ. Microsoft cung cấp các ví dụ (được tìm thấy trên trang lớp học System.Net.Sockets.SocketAsyncEventArgs
) sẽ gây tràn ngăn xếp nếu có một số lượng lớn các kết nối đang chờ xử lý, có thể được khai thác trên bất kỳ hệ thống nào triển khai mô hình xử lý của chúng.Tràn ngăn xếp khi sử dụng mô hình System.Net.Sockets.Socket.AcceptAsync
Các ý tưởng khác để giải quyết vấn đề này là tạo vòng lặp gọi phương thức xử lý, với điều kiện là giá trị Socket.AcceptAsync
trả về bằng false và để ngắt vòng lặp (để cho phép xử lý trì hoãn) nếu giá trị chỉ ra rằng hoạt động đang được hoàn thành không đồng bộ (đúng). Tuy nhiên, giải pháp này cũng gây ra lỗ hổng tràn ngăn xếp do thực tế là cuộc gọi lại được liên kết với số SocketAsyncEventArgs
được chuyển đến Socket.AcceptAsync
có ở cuối phương thức, gọi tới số Socket.AcceptAsync
, cũng có vòng lặp cho các kết nối có sẵn, đồng bộ ngay lập tức .
Như bạn có thể thấy, đây là một vấn đề khá vững chắc và tôi chưa tìm được giải pháp tốt nào không liên quan đến System.Threading.ThreadPool
và tạo tấn phương pháp khác và xử lý lịch biểu. Theo như tôi thấy, mô hình socket không đồng bộ liên quan đến Socket.AcceptAsync
đòi hỏi nhiều hơn những gì được thể hiện trong các ví dụ trên MSDN.
Có ai có giải pháp sạch và hiệu quả để xử lý ngay các kết nối đang chờ xử lý được chấp nhận đồng bộ từ Socket.AcceptAsync mà không cần tạo chuỗi riêng để xử lý các kết nối và không sử dụng đệ quy không?
Yeah, các ví dụ trên MSDN không phải lúc nào (thực tế hoặc tốt nhất, cho rằng vấn đề) tốt nhất. Bạn có thể làm rõ câu hỏi của bạn? Bạn đang tìm kiếm một cách để làm việc với các ổ cắm asyc mà sẽ không gây ra StackOverflowExceptoin? – Oded
Điều đó là chính xác; Tôi đang tìm một cách không đệ quy để xử lý các kết nối đang chờ xử lý ngay lập tức. –
Xem thêm http://stackoverflow.com/questions/2002143/asynchronous-sockets-handling-false-socket-acceptasync-values – Lucero