Обходной путь для проблемы с тайм-аутом TcpChannel при удаленном взаимодействии .NET

Поскольку я (и многие другие люди в Интернете) не могу настроить тайм-аут TcpChannel на стороне клиента при использовании .NET Remoting (пожалуйста, не предлагайте правильные исправления, я буквально все перепробовал, и никаких предложений WCF, пожалуйста), я придумали то, что кажется достойным обходным путем для создания тайм-аута на стороне клиента, который мы можем настроить. Если я передаю каждый вызов Remoting через отдельный поток таймера, и вызов либо истекает по тайм-ауту, либо генерирует исключение, тогда я могу убить поток и предположить, что сервер не работает.

Тем не менее, я запустил это с другим коллегой, и он был непреклонен в том, что я могу вызвать взаимоблокировку в собственном машинном коде .NET, сделав это. Я читал другие случаи использования этого типа техники в Интернете, такие как этот пост здесь, поэтому я не уверен, действительно ли мне следует беспокоиться о взаимоблокировке. Я вижу, что это может быть проблемой, если поток прерывается в середине отправки или получения чего-либо, но не в том случае, если мы просто ждем ответа.


person Bender the Greatest    schedule 08.10.2012    source источник
comment
Когда вы говорите «убить нить», вы говорите об использовании Thread.Abort? Если это так, это правда, что в некоторых случаях это может вызвать неприятные побочные эффекты. См. этот ответ для получения дополнительной информации.   -  person Dan Bryant    schedule 08.10.2012
comment
Я подумывал об использовании Thread.Abort(), но более внимательное изучение System.Threading.Thread показывает метод Join, который блокирует вызывающий поток до тех пор, пока дочерний поток либо не вернется, либо не истечет время ожидания. Это кажется гораздо более безопасным подходом.   -  person Bender the Greatest    schedule 08.10.2012
comment
Обратите внимание, что Join не завершит поток в случае тайм-аута; заблокированный или иным образом некорректно работающий поток будет по-прежнему работать в фоновом режиме после истечения времени присоединения.   -  person Dan Bryant    schedule 08.10.2012
comment
Поправьте меня, если я ошибаюсь, но если поток завершает свою функцию, разве поток не завершается? В конце концов тайм-аут ДЕЙСТВИТЕЛЬНО происходит, я просто не могу его настроить (занимает около 45-60 секунд). Это вызывает исключение, которое я обработал, ничего не делает, и в конечном итоге функция потока возвращает значение.   -  person Bender the Greatest    schedule 08.10.2012
comment
Да, если поток действительно завершится, он завершится. Только если вы пытаетесь завершить работу из-за того, что он заблокирован, Join оставит его зависшим. Поток, вызывающий Join, вернется после тайм-аута, но поток, который вы пытались выполнить Join, останется в заблокированном состоянии.   -  person Dan Bryant    schedule 08.10.2012
comment
Присоединение оставит его висящим только в том случае, если я не укажу тайм-аут, который я указываю. Сам поток блокируется до тех пор, пока не наступит тайм-аут удаленного взаимодействия, но тайм-аут ни в коем случае не бесконечен.   -  person Bender the Greatest    schedule 08.10.2012


Ответы (1)


Поскольку Дэн не опубликовал ответ, а только прокомментировал, я приписываю этот ответ ему. Кажется, что этот метод управления тайм-аутом хорош, если вы принимаете меры предосторожности, чтобы гарантировать, что выполнение потока не продолжится в случае тайм-аута. Я также рекомендую не использовать Thread.Abort, если вы не знаете, что делаете.

person Bender the Greatest    schedule 17.10.2012