Я бы предложил перейти к WCF, это гораздо лучше поддерживаемая технология для этого сценария.Поведение WCF в этом случае заключается в обнаружении разорванного соединения при каждом вызове RPC и предоставлении вам исключения в ответ.Он не имеет встроенной логики повторения, вам придется обернуть свой клиентский код в обработку исключений, которая отправляет повтор.По крайней мере, он не будет просто зависать и не возвращаться, поэтому вам не придется писать собственный код обработки тайм-аута / отмены.
Обратите внимание, что период подключения WCF может быть длительным (~ 30 секунд при включенном IPv6клиент для подключения, время ожидания 60 секунд для уже установленного соединения, которое разрывается из-за ненормально отключенного сервера), поэтому, если ваши требования к задержке для обнаружения разорванного соединения более жесткие, вам все равно нужно написать собственную логику тайм-аута / отмены.Например, если вы выполняете сетевой RPC в ответ на действие пользователя по обновлению пользовательского интерфейса, вы можете захотеть иметь более короткое время ожидания, чем 30-60 секунд.Будьте осторожны, чтобы сделать его слишком коротким, поскольку соединениям IPv6 может потребоваться от 20 до 30 секунд, чтобы время от времени успешно согласовывать соединение.Это происходит из-за всех согласований совместимости / туннелирования IPv6 / IPv4, которые происходят за кулисами основного соединения TCP / IP.