Почему консольные приложения C # могут вызывать `Application.Run ()`? - PullRequest
0 голосов
/ 29 июня 2018

Я видел несколько примеров консольных приложений, вызывающих Application.Run(), который запускает цикл сообщений в текущем потоке без формы.

https://msdn.microsoft.com/en-us/library/ms157900(v=vs.110).aspx

Однако, как указано в документации:

В приложении на основе Win32 или Windows Forms цикл обработки сообщений является подпрограмма в коде, которая обрабатывает пользовательские события, такие как щелчки мыши и нажатия клавиш.

Итак, похоже, что Application.Run() относится только к приложениям с графическим интерфейсом.

Тогда какова цель вызова Application.Run() из консольных приложений, и существует ли более разумный способ достижения той же функциональности в консольных приложениях?

1 Ответ

0 голосов
/ 29 июня 2018

Вы должны увидеть более широкую картину, это не Application.Run (), который создает приложение с графическим интерфейсом. Это создает окно, которое делает. Библиотеки классов, которые поддерживают окно, а также многие системные и сторонние компоненты, которые взаимодействуют с ним, никогда не являются поточно-ориентированными. Но графический интерфейс всегда должен иметь дело с уведомлениями, генерируемыми из разных потоков, обычно расположенных в разных процессах или ОС.

Сложная проблема, но она очень распространена в разработке программного обеспечения и имеет универсальное решение. Вы должны решить проблему производитель-потребитель . Для чего требуется потокобезопасная очередь, она предоставляется ОС. И цикл, который очищает эту очередь и отправляет уведомления, это то, что делает Application.Run ().

Также единственный практический способ заставить код работать в специфичном потоке. Что кажется чем-то, что должно быть легко сделать, но это не так. Поток всегда занят выполнением кода, вы не можете просто произвольно прервать его и заставить его сделать что-то еще, что создает ужасные проблемы повторного входа. Цикл диспетчера - это безопасное место, в котором поток сообщает, что он простаивает и готов сделать что-то еще. Вероятно, почему вы видели это в приложении в режиме консоли. Особенно мертвец, когда вы видите асинхронный / ожидающий в этом коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...