Tôi tin rằng bạn làm điều đó theo cách tương tự như bất kỳ hoạt động không đồng bộ khác trong .NET: bạn gọi phiên bản BeginXXX của phương pháp này, trong trường hợp này BeginAcceptSocket. Gọi lại của bạn sẽ thực thi trên nhóm luồng.
Chủ đề gộp chung thường tốt hơn nhiều so với kết nối mỗi lần: một khi bạn vượt qua vài chục kết nối, hệ thống hoạt động khó khăn hơn trong việc chuyển đổi giữa các chủ đề hơn là thực hiện công việc thực tế. Ngoài ra, mỗi luồng có ngăn xếp riêng của nó thường có kích thước 1MB (mặc dù nó phụ thuộc vào cờ liên kết) mà phải được tìm thấy trong không gian địa chỉ ảo 2GB (trên các hệ thống 32 bit); trong thực tế điều này giới hạn bạn ít hơn 1000 chủ đề.
Tôi không chắc liệu luồng mạng của .NET hiện có sử dụng nó hay không, nhưng Windows có đối tượng hạt nhân được gọi là Cổng hoàn thành I/O hỗ trợ I/O có thể mở rộng. Bạn có thể kết hợp các chủ đề với đối tượng này và các yêu cầu I/O (bao gồm việc chấp nhận các kết nối đến) có thể được liên kết với nó. Khi một I/O hoàn thành (ví dụ kết nối đến) Windows sẽ phát hành một chuỗi chờ, nhưng chỉ khi số lượng các chuỗi chạy hiện thời (không bị chặn vì một lý do nào đó) nhỏ hơn giới hạn khả năng mở rộng được cấu hình cho cổng hoàn thành. Thông thường bạn sẽ thiết lập điều này thành một bội số nhỏ của số lõi.
Nguồn
2008-09-15 13:22:00
Cảm ơn vì mã nguồn, tôi sẽ mã hóa nó như thế này. Chủ đề mới có thể tốn kém, nhưng vì tôi không vượt quá 5 hoặc 6 kết nối đến đồng thời, điều này sẽ ổn cho đến bây giờ. –
Trình nghe suy nghĩ và tcpListener bị nhầm lẫn trong ví dụ, nếu không thì mã tốt. Tìm thấy: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx dựa trên những gì tôi đã đọc ở đây. –
Mã hiện tại rất nguy hiểm trong ngữ cảnh hoạt động, tôi sẽ chỉnh sửa nó ... – Beygi