Немного опоздал с игрой на этом, но я просто разработал решение для этого, поэтому я думал, что поделюсь. Для отображения элементов пользовательского интерфейса они должны быть созданы в потоке пользовательского интерфейса, в котором они будут отображаться. Поскольку долго выполняющаяся задача находится в потоке пользовательского интерфейса, она не позволит обновить индикатор выполнения. Чтобы обойти это, я создал индикатор выполнения в новом потоке пользовательского интерфейса и создал страницы в основном потоке пользовательского интерфейса.
Thread t = new Thread(() =>
{
ProgressDialog pd = new ProgressDialog(context);
pd.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
pd.Show();
System.Windows.Threading.Dispatcher.Run();
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();
Action(); //we need to execute the action on the main thread so that UI elements created by the action can later be displayed in the main UI
ProgressDialog - это мое собственное окно WPF для отображения информации о прогрессе.
'context' содержит данные о прогрессе для моего диалога прогресса. Он включает отмененное свойство, поэтому я могу прервать действие, выполняемое в главном потоке. Он также содержит свойство complete, поэтому диалоговое окно хода выполнения может закрываться после завершения действия.
«Действие» - это метод, используемый для создания всех элементов пользовательского интерфейса. Он контролирует контекст для флага отмены и прекращает генерирование элементов пользовательского интерфейса, если флаг установлен. Он устанавливает полный флаг, когда это сделано.
Я не помню точную причину, по которой мне пришлось установить Thread 't' для потока STA и IsBackground в true, но я почти уверен, что без них это не сработает.