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

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

0
codewario 8 Окт 2012 в 17:53
Когда вы говорите «убить поток», вы имеете в виду использование Thread.Abort? Если это так, это правда, что в некоторых случаях это может вызвать неприятные побочные эффекты. Дополнительную информацию см. В этом ответе.
 – 
Dan Bryant
8 Окт 2012 в 18:07
Я думал об использовании Thread.Abort (), но более внимательное изучение System.Threading.Thread показывает метод Join, который блокирует вызывающий поток до тех пор, пока дочерний поток не вернется или не истечет время ожидания. Это кажется более безопасным подходом.
 – 
Bender the Greatest
8 Окт 2012 в 18:21
Обратите внимание, что Join не завершает поток в случае тайм-аута; зашедший в тупик или иначе некорректный поток будет по-прежнему работать в фоновом режиме после истечения времени ожидания соединения.
 – 
Dan Bryant
8 Окт 2012 в 22:31
Поправьте меня, если я ошибаюсь, но если поток завершает свою функцию, поток не завершается? В конце концов таймаут ДЕЙСТВИТЕЛЬНО случается, я просто не могу его настроить (занимает около 45-60 секунд). Это вызывает исключение, которое я обработал, ничего не делает, и в конечном итоге функция потока возвращается.
 – 
Bender the Greatest
8 Окт 2012 в 23:02
1
Да, если поток действительно завершится, он завершится. Только если вы пытаетесь завершить работу, потому что она заблокирована, Join оставит ее зависшей. Поток, вызывающий Join, вернется после тайм-аута, но поток, к которому вы пытались присоединиться, останется в «заблокированном» состоянии.
 – 
Dan Bryant
8 Окт 2012 в 23:05

1 ответ

Лучший ответ

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

0
Bender the Greatest 17 Окт 2012 в 19:16