Я бы попробовал заменить Application.DoEvents();
на простой Thread.Sleep(100)
. Документация вокруг DoEvents
, похоже, не указывает, разрешено ли вам вызывать ее из другого потока, не являющегося пользовательским интерфейсом. Используя вместо этого Thread.Sleep
, вы задерживаете всплывающее окно сообщения и позволяете потоку пользовательского интерфейса нормально обрабатываться.
Альтернативный метод, позволяющий рабочему фону всплывать в окне сообщения, - использовать событие и вызывать подписанных делегатов в потоке пользовательского интерфейса (так же, как вы делаете для индикатора выполнения).
На самом деле, если вы хотите, вы, возможно, могли бы переписать свой код потока, чтобы использовать объект BackgroundWorker , и подписаться на события ProgressChanged
и RunWorkerCompleted
. Ваш фактический код потока будет отвечать за вызов метода ReportProgress
для запуска события ProgressChanged
для обновления индикатора выполнения.
Ответ на обновление
Посмотрев на ваш новый код, вы никогда не установите максимальное значение индикатора выполнения после завершения работы. В worker_RunWorkerCompleted
добавьте progressBar1.Value = progressBar1.Maximum;
перед отображением окна сообщения. Это должно обновить индикатор выполнения до максимума, прежде чем появится окно сообщения.