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