Я удивлен, что никто не рекомендовал использовать SocketOptions.
Как только стек выполняет операцию отправки или получения, он связывается с параметрами сокета сокета.
Используйте небольшой тайм-аут для отправки или получения и используйте его перед операцией, поэтому вам все равно, будет ли он изменен во время той же операции на что-то более короткое или длинное.
Это приведет к большему переключению контекста, но не потребует закрытия сокета ни при каком протоколе.
Например:
1) Установить небольшой тайм-аут
2) Выполнять операции
3) Установить тайм-аут больше
Это похоже на использование Blocking = false, но с указанным вами автоматическим таймаутом.