Я создаю настраиваемый элемент управления диаграммой, и я хотел бы иметь возможность отображать какую-то панель ожидания, пока выполняются другие команды (т.е. создается диаграмма).
Я использую ProgressBar
(System.Windows.Forms.ProgressBar
в режиме выделения) как часть этого элемента управления. Мне не нужно обновлять состояние индикатора выполнения, я просто хочу, чтобы он перемещался снова и снова, пока диаграмма не будет создана.
Сейчас я использую его по следующей схеме:
- Запустить полосу ожидания (появится ProgressBar
и начнет работать)
- Вызвать методы построения графика
- Когда график будет готов, полоса ожидания будет скрыта.
Проблема в том, что некоторые методы построения диаграмм действительно требовательны к вычислительным ресурсам, и полоса ожидания в такие моменты зависает. Как избежать этих зависаний? Должен ли я использовать какой-то потоковый/фоновый рабочий? И если да, то как проще всего это сделать?
Обратите внимание, что мне не нужно менять состояние индикатора выполнения во время подготовки диаграммы. Мне просто нужно, чтобы панель ожидания запускалась, работала во время всех вычислений и после этого останавливалась.
ИЗМЕНИТЬ
Хорошо, как и было предложено, я создал отдельный поток для этих требовательных вычислений, чтобы избежать зависаний.
Но как дождаться завершения потока и не заморозить GUI?
Я попробовал, как было предложено здесь, что-то как это:
Thread t = new Thread( () => { DoSomeLongAndDemandingTask(withParameters); });
t.Start();
t.Join()
// do something that needs to be done after thread finishes
InvokeMeAfterThreadFinished();
Но это замораживает графический интерфейс. Есть ли другой способ избежать этих зависаний?