"На чем писать - это вопрос разработчика." вот это точно нельзя пускать на самотек. Сейчас полно желающих использовать все самое последнее и модное (Angular 5, Web Components 2 и т.п.). Начнут это использовать, потом им надоест и бросят (процентов на 80%-и) или допилят только до старта, и останется заказчик с проектом который поддержать смогут только единицы с заоблачными окладами, а бюджет уже иссяк.
Андрей, Вам не нужно менять данные в SQL запросе, вам лучше произвести конвертацию данный на уровне View написав Converter, что позволит в будущем менять формат преставления просто изменив шаблон в параметре конвертера. Как создавать конвертеры написано в https://www.wpftutorial.net/valueconverters.html
Mozzarella, ReadStreamCallback - это делегат, который может принадлежать обьекту, что в себе хранит любые необходимые данные о клиенте. Так что для того чтобы узнать кто послал запрос пробегаться по списку нет нужды.
А создание любого потока, это выделение минумум 1 мб данных для стека потока.
Stels007, А как иначе то. Рекурсивный вызов да еще в вечном цикле, показывает что нет даже малейшего понимания того, что пишете. Что уж тогда обьяснять, что для TcpListener нужно применять асинхронный подход, который вообще не требует создания потоков
var binding = new BasicHttpBinding();
// тут его настройки
var endpoint = new EndpointAddress("http://xxx.xxx.xxx.xxx:yyyy/Server/soap");
var client = new WebServiceclient(binding, endpoint);