Вы можете использовать функцию Socket.Select()
Select(IList checkRead, IList checkWrite, IList checkError, int microSeconds)
для проверки нескольких сокетов на предмет читабельности или возможности записи.Преимущество в том, что это просто.Это может быть сделано из одного потока, и вы можете указать, как долго вы хотите ждать, либо навсегда (-1 микросекунда), либо определенную продолжительность.И вам не нужно делать ваши сокеты асинхронными (т.е. блокировать их).
Это также работает для прослушивания сокетов.Это сообщит о возможности записи.когда есть соединение, чтобы принять.Из экспериментов я могу сказать, что он также сообщает о читаемости для изящных разъединений.
Вероятно, это не так быстро, как асинхронные сокеты.Это также не идеально подходит для обнаружения ошибок.Третий параметр мне не особо пригодился, потому что он не обнаруживает неблагодарного разъединения.