У вас вроде логгирование есть, можно понять - в чём проблема.
На первый взгляд:
1. При создании Thread используйте IsBackground - для того, чтобы при закрытии программы, дочерние потоки тоже убивались, а не продолждали работать дальше в фоне
Thread listeningThread = new Thread(Listen);
listeningThread.IsBackground = true;
listeningThread.Start();
2. _client сейчас у Вас глобальная переменная, и использование многопоточности в таком случае - бессмысленно, т.к. при создании новоего соединения, старый _client перезаписывается на новый, не имеющий отношения к старому соединению;
3. Посмотрите в сторону использования SignalR. Для озвученных задач мне кажется он Вам больше подойдёт.