Я использую Visual Studio 2017.
Всякий раз, когда я нажимаю F5, чтобы начать отладку своей программы, я замечаю, что Main(string[] args)метод внутри Programкласса не вызывается, хотя поля внутри Programинициализированы, как вы можете видеть на скриншоте ниже:

После создания TcpClientэкземпляра и последующего назначения его соответствующему полю отладчик никогда не достигает точки останова, которую я установил для Main(string[] args)метода.
Чтобы быть уверенным, я установил объект запуска для своего проекта в качестве Programкласса. Это не решило проблему:

Что мне не хватает?
РЕДАКТИРОВАТЬ:
Я добавил Console.WriteLine("Entering Main method...")в свой Mainметод, но он не выводится на консоль, когда я начинаю отладку.
Буквально ничего (или, скорее, сразу ничего не видно) не происходит после создания TcpClientэкземпляра — никаких исключений; программа не завершает работу самостоятельно; консоль остается пустой.
РЕДАКТИРОВАТЬ:
Оказывается, внутри TcpClientконструктора происходит сбой.
Решение проблемы
Помните, что TcpClient(string, int)конструктор открывает новое соединение в этой точке ( doc ):
Инициализирует новый экземпляр класса TcpClient и подключается к указанному порту на указанном узле.
...
Этот конструктор создает новый TcpClient и делает попытку синхронного подключения к предоставленному имени хоста и номеру порта.
Если я скопирую/вставлю ваш код (вставив свой собственный RemoteServerIpAddressString), то я увижу, что приложение зависает, пытаясь построить файл TcpClient. Если я сломаю отладчик в этот момент, я увижу, что он застрял в System.Net.Sockets.Socket.DoConnect, который пытается подключиться к удаленной машине.
Через некоторое время он сдается, генерирует исключение и TypeInitializationExceptionвыбрасывает a, что ломает отладчик.
Это соответствует вашему наблюдению:
Буквально ничего (или, скорее, сразу ничего не видно) не происходит после создания экземпляра TcpClient — никаких исключений; программа не завершает работу самостоятельно; консоль остается пустой.
На данный момент TcpClientвсе еще пытается подключиться. Пока это не удастся, тип никогда не будет инициализирован, и пока это не произойдет Main, он никогда не будет запущен. Если вы оставите его на достаточно долгое время, он, вероятно, потерпит неудачу, как и мой.
Если я удостоверюсь, что TcpClientподключается к открытому порту, TcpClientконструктор сразу завершается и Mainзапускается.
Очень плохая идея делать долговременные вещи, особенно сетевые, внутри статического конструктора. Среде CLR необходимо получить блокировку при инициализации типа, что препятствует инициализации других типов и может привести к взаимоблокировкам.
Вы, вероятно, захотите либо построить TcpClientвнутри своего Mainметода, либо построить его как:
private static readonly TcpClient TcpClient = new TcpClient();
а затем в основном:
TcpClient.Connect(...);
Комментариев нет:
Отправить комментарий