Обрабатывать тысячи соединений не сложно, если вы используете только асинхронные API. Концепция «один поток на соединение» не только не масштабируется, но и (в общем случае протокола) неверна. Обратите внимание, что асинхронные API отличаются от использования ThreadPool
.
Асинхронное программирование занимает некоторое время, чтобы освоиться, но это не так уж сложно. Вам придется вручную отслеживать больше состояний, чем в синхронном программировании.
Убедитесь, что ваши классы протокола могут обрабатывать частичные получения любого размера (что требует дополнительного состояния), и что у вас есть один экземпляр протокола на соединение.
Любые ошибки сокета должны привести к закрытию соединения и очистке состояния.
И лог. Все. TraceSource
твой друг; узнайте, как использовать трассировку .NET, которую можно включить (даже в производственной среде), отредактировав app.config.