Вы можете читать столько портов, сколько хотите, но вам нужно использовать асинхронное чтение.В настоящее время вы используете синхронные (или «блокирующие») вызовы, что означает, что ваш код останавливается и ожидает поступления данных на один порт и больше ничего не может сделать во время чтения.
Асинхронное чтениес другой стороны, это означает, что когда вы вызываете метод Read, он запускает операцию чтения и немедленно возвращается к выполнению вашего кода.Ваш код продолжает выполняться, и в какой-то момент в будущем (когда будут доступны некоторые данные) предоставленный вами делегат будет отозван.Затем он завершает операцию чтения для получения данных.
Затем вы можете инициировать столько чтений, сколько необходимо, и уйти и делать все, что вы хотите сделать (или сидеть в занятом цикле ожидания) до результатоввозвращайтесь. Вам просто нужно обратить внимание на то, откуда поступили данные, чтобы отслеживать различные потоки сообщений, поступающие в ваше приложение.
Ознакомьтесь с операциями асинхронного потока, такими как NetworkStream.BeginRead .
Примеры можно легко найти, выполнив поиск в C # TCPClient BeginRead и похожих запросах, например,
http://www.albahari.com/nutshell/ch20.aspx
NetworkStream BeginRead/ EndRead
и т. Д.