Необходимо убедиться, что элементы графического интерфейса создаются в главном потоке формы, а не из отдельного потока.Итак, вам нужно получить поток, который выполняет всю работу, чтобы основной поток формы отображал и обновлял индикатор выполнения.Это займет немного рефакторинга.
Итак, в вашем рабочем потоке:
void DoWork () // of whatever it's called
{
main_form.CreateProgressBar ();
while (doing stuff)
{
main_form.IncrementProgressBar ();
do stuff
}
main_form.DestroyProgressBar ();
}
И в основной форме:
delegate void Callback ();
void CreateProgressBar ()
{
if (InvokeRequired)
{
Invoke (new Callback (CreateProgressBar));
}
else
{
progress_bar = CreateProgressBar ();
}
}
void IncrementProgressBar ()
{
if (InvokeRequired)
{
Invoke (new Callback (IncrementProgressBar ));
}
else
{
progress_bar.IncrementProgressBar ();
}
}
void DestroyProgressBar ()
{
if (InvokeRequired)
{
Invoke (new Callback (DestroyProgressBar));
}
else
{
progress_bar.Close ();
progress_bar = null;
}
}
InvokeRequired
определяет, совпадает ли вызывающий поток споток GUI.Если вызывающий поток не является потоком GUI, Invoke
используется для изменения контекста потока.Это синхронная версия, которая не будет завершена, пока не будет завершен вызванный метод.Существует асинхронная версия под названием BeginInvoke
, но она не нужна для того, что вы делаете.