Помните, что конструктор TcpClient(string, int)
открывает новое соединение, в этот момент ( doc ):
Инициализирует новый экземпляр класса TcpClient и подключается к указанному порту на указанном хосте.
...
Этот конструктор создает новый TcpClient и выполняет попытку синхронного подключения к указанному имени хоста и номеру порта.
Если я копирую / вставляю ваш код (вставляя свой собственный RemoteServerIpAddressString
), то я вижу, что приложение зависает при попытке создать TcpClient
. Если в тот момент я сломаю отладчик, я вижу, что он застрял в System.Net.Sockets.Socket.DoConnect
, который пытается подключиться к удаленному компьютеру.
Через некоторое время он сдается, выдает исключение, и выдается TypeInitializationException
, что прерывает отладчик.
Это соответствует вашему наблюдению:
Буквально ничего (точнее, ничего сразу не видимого) не происходит после создания экземпляра TcpClient - исключений нет; программа не заканчивается самостоятельно; консоль остается пустой.
На данный момент TcpClient
все еще пытается подключиться. Пока это не выполнится, тип никогда не будет инициализирован, и пока это не произойдет, Main
никогда не будет запущен. Если вы оставите его достаточно долго, он, вероятно, потерпит неудачу, как мой.
Если я убедился, что TcpClient
подключается к открытому порту, тогда конструктор TcpClient
сразу завершается, и Main
запускается.
Это очень плохая идея - делать длительные вещи, особенно сетевые, внутри статического конструктора. CLR должен получить блокировку при инициализации типа, и это мешает инициализации других типов и может вызвать взаимные блокировки.
Возможно, вы захотите либо создать TcpClient
внутри вашего Main
метода, либо создать его как:
private static readonly TcpClient TcpClient = new TcpClient();
и затем в основном:
TcpClient.Connect(...);