Обычными действиями, которые блокируют основной поток, являются такие, как открытие окон сообщений или модальное диалоговое окно. Основной код блокируется при вызове MessageBox или ShowDialog.
То, как работают эти элементы (а MessageBox - это просто специализированный модальный диалог), заключается в том, что они содержат собственный насос сообщений, пока они блокируются.
Несмотря на то, что это неприятный хак, вы можете сделать что-то подобное в своем приложении, зацикливая вызов Application.DoEvents (), чтобы поддерживать прокачку пользовательских сообщений, пока вы ожидаете завершения другой задачи. Вы должны быть осторожны, потому что всевозможные неприятные вещи могут привести к тому, что такие сообщения перекачиваются - например, кто-то закрывает форму или повторно вводит ваш текущий обработчик сообщений - модальные диалоги избегают этого, эффективно отключая ввод из формы, которая их запускает.
Я действительно хотел сказать, что BackgroundWorker - лучшее решение, если вы можете сделать его подходящим. Иногда я комбинирую его с модальным «диалоговым окном прогресса», чтобы дать мне фоновую нить / прокачку сообщений и блокировку потока пользовательского интерфейса.
Изменить - расширить последний бит:
Один из подходов, которые я использовал, - это наличие класса «форма выполнения», который принимает объект BackgroundWorker в качестве параметра конструктора и содержит обработчики для событий прогресса и завершения фонового работника, который ему передается.
Форма, которая хочет, чтобы работа была выполнена, создает фонового работника и подключает событие 'работа' (не может вспомнить, как оно называется прямо сейчас), а затем создает диалоговое окно прогресса, в которое оно передает фонового работника. Затем он модально отображает диалоговое окно прогресса, что означает, что он будет ждать (но качает сообщения), пока диалоговое окно прогресса не закроется.
Форма выполнения отвечает за запуск BackgroundWorker из его переопределения OnLoad и закрывает себя, когда видит, что BackgroundWorker завершен. Очевидно, что вы можете добавить текст сообщения, индикаторы выполнения, кнопки отмены, что угодно в форму выполнения.