GOOGLE ADS

воскресенье, 10 апреля 2022 г.

Метод main(string[] args) не вызывается

Я использую 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(...);

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...