Tôi cần kết nối với hàng nghìn máy khách qua TCP trên giao thức độc quyền để thu thập dữ liệu theo chu kỳ. Tôi cần phải viết một ứng dụng máy chủ .NET trong C#.Bỏ phiếu qua hàng nghìn cổng TCP
Nỗ lực đầu tiên là tạo cho mỗi socket tcp một luồng riêng, hoạt động nhưng cần rất nhiều việc sử dụng CPU.
Tôi phát hiện ra rằng tốt hơn nên sử dụng .NET threadpool. Theo như tôi hiểu (http://msdn.microsoft.com/en-us/library/ms973903.aspx) tôi có thể sử dụng bộ đếm thời gian để có được mỗi ổ cắm có được dữ liệu theo chu kỳ trong một khoảng thời gian nhất định (như 1 giây). Điều này không làm việc cho tôi bởi vì các khe cắm hết thời gian sau khi kết nối được mở ra bởi vì có rất nhiều ổ cắm hơn phải được mở trước khi nó mở các ổ cắm một lần nữa.
Một lần thử khác là sử dụng gọi lại không đồng bộ. Điều này sẽ làm việc cho tôi nhưng tôi không biết làm thế nào để có được các ổ cắm có được dữ liệu cyclically ???
Từ "hàng nghìn" và "chủ đề" không đi đôi với nhau. Hãy thử xem liệu bạn có thể sử dụng từ khóa 'await' để tiếp tục, điều này sẽ cho phép bạn viết mã chống lại các cổng chặn mà không có mã thực sự chặn rất thường xuyên. Đây là loại nguyên tắc đằng sau Erlang và Stackless Python - hai ngôn ngữ được xây dựng đặc biệt cho mạng đồng thời. –
Tại sao bạn phải chu kỳ thông qua các khách hàng để có được dữ liệu? nó sẽ đơn giản hơn (mặc dù đó là tương đối) để chỉ giữ một async đọc được đăng trên mỗi ổ cắm và xử lý dữ liệu khi chúng đến. Nếu bạn thực sự cần đọc theo chu kỳ, bạn có thể trì hoãn đăng lại của một async đọc cho đến khi tất cả các ổ cắm khác đã được phục vụ. –
chỉ cần không thăm dò ý kiến. –