Я и так показываю MessageBox из основного потока. Проясню некоторые детали. Представте себе главную форму с несколькими кнопками, выполняющие раличные операции, причем эти операции взаимоисключающие, т.е. когда выполняется одна, никакие другие выполняться не должны. Эти "тяжелые" операции выполняются в главном потоке, соответственно пока это происходит главное окно кажется пользователю "подвисшим". Что бы сделать интерфейс более дружественным было решено вызывать в новом потоке форму, на которой будет ProgressBar, а главный поток будет периодически репортить о прогрессе операции. Приведенный мною способ вызова дополнительной формы — единственно мне известный. Поясню:
1) Если вызывать дополнительную форму методом new Form(...).Show(), то оно будет не живой, так как отсутствует цикл обработки сообщений.
2) Если я попытаюсь вызвать дочернюю форму из основного потока методом Application.Run(), то поток подиснет, ибо цикл обработки сообщений бесконечный.
Соответственно единственный выход сделать так, что бы новая форма была "живой", а основной поток не останавливался — новая форма в новом потоке черех Application.Run(), как у меня и сделано.
В принципе это работало без проблем до тех пор, пока мне не потребовалось выдавать диалоговое окно по завершении длительной операции. Что было раньше:
ОП — основной поток, ДП — дополнительный поток
1. ОП выполняется и периодически извещает ДП о прогрессе
2. После заврешения операции ОП вызывает CloseForm() на объекте ProgressForm ДП
3. Происходит уничтожение ProgressForm, цикл обработки оконных сообщений завершается, ДП умирает
4. ОП вызывает метод MessageBox.Show() что бы уведомить пользователя о завершении.
Так вот, если выкинуть последний шаг, то все Ок. Если же он присутствует, то после того, как я кликну на Ок месседж-бокса, то есть когда я выйду из 4-го шага, форма теряет выделение и отправляется на самый задний план Windows.
Как с этим бороться?