occhio che hai thread, quindi sono due "miniprocessi" separati che hanno un minimo di vita indipendente. Questo vuole dire che il thread può interrompersi dopo aver letto disconnetti, e riprendere in un'istante in cui dal client hai cambiato il valore di disconnetti, di fatto perdendo l'evento perché tu non rileggi disconnetti. Proprio per questo motivo devi stare molto attento a quel valore e passare il meno possibile per variabili d'appoggio (disconnetti locale appunto).

La read si blocca perché da un lato hai la disconnessione e chiudi, ma dall'altro lato non ti accorgi o non gestisci bene il punto in cui ti trovi.