Spiega meglio il "si blocca in attesa di connessioni"

che output da la console?

Ti chiede di inserire comandi?

Controlla il fatto che la console viene scritta da entrambi i thread.. ciò comporta che probabilmente se il thread connessioni utilizza la console magari la rende inaccessibile all'altro thread..

In generale, quando più thread condividono una risorsa ( console, oggetti ecc...) è buona norma fare un metodo delegato, chiamato poi con invoke, in modo che non si verifichino operazioni crossthread o blocchi dell'applicazione..