Я думаю, что важно определить, что подразумевается под словом «связь».
Если другая система создает новое соединение с вашим TcpListener при каждой отправке транзакции, тогда это будет считаться несколькими соединениями, и было бы целесообразно иметь выделенный поток для обработки этих входящих запросов на соединение. Если дело обстоит именно так, игнорируйте все, что находится за этим, и используйте предложенное решение gahooa.
С другой стороны, если другая система просто устанавливает соединение и отправляет все транзакции по тому же соединению, то на самом деле нет смысла обрабатывать запрос на соединение в отдельном потоке (поскольку существует только одно соединение). Если это так, то я бы предложил принять входящий запрос один раз и прочитать сокет асинхронно (в отличие от опроса сокета для данных). Каждый раз, когда вы получаете полную транзакцию, бросайте ее «через стену» в поток обработки транзакций. Когда обработка завершена и вычислен «ответ», перебросьте его «через стену» в поток ответов, который отправит результат обратно в другую систему. В этом сценарии в основном четыре потока:
- Основная нить
- Читать тему
- Обработка потока
- Написать тему
Главный поток создает TcpListener и ожидает установления соединения. В этот момент он просто инициирует асинхронное чтение и ожидает завершения программы (ManualResetEvent.WaitOne ()).
Поток Read - это асинхронный поток, который обслуживает чтение из NetworkStream.
Поток обработки получает транзакции из потока чтения и выполняет любую необходимую обработку.
Поток записи принимает все ответы, сгенерированные потоком обработки, и записывает их в NetworkStream.
Согласно этой ссылке вам не нужно синхронизировать чтение и запись из одного и того же NetworkStream, если чтение и запись выполняются в отдельных потоках. Вы можете использовать общий список или очередь для перемещения данных между потоками. Я бы создал один для данных для чтения и обработки и один для данных для обработки записи. Обязательно синхронизируйте доступ к ним, используя свойство SyncRoot.