У меня есть требование отображать индикатор выполнения в моем приложении WPF при переходе от одного представления к другому. У меня есть сервис, чтобы показать и закрыть индикатор выполнения. Мой код для отображения индикатора выполнения выглядит следующим образом. И он показывает отлично.
public void ShowProgressBar<T>() where T : Window
{
var thread = new Thread(
new ThreadStart(
delegate ()
{
_progressWindow = Activator.CreateInstance<T>();
_progressWindow .Show();
_currentDispatcher = Dispatcher.CurrentDispatcher;
Dispatcher.Run();
}
));
thread.SetApartmentState(ApartmentState.STA);
thread.Priority = ThreadPriority.Highest;
thread.IsBackground = true;
thread.Start();
}
После того, как отображается индикатор выполнения, я пытаюсь перейти к другому представлению, используя viewManagementService, в котором он удалил существующее представление из региона, если оно есть, и добавил новое представление и Так как я знаю последний метод, который был запущен, я пытаюсь закрыть свой индикатор выполнения там же классом обслуживания, внедренным в его конструктор, и мой закрывающий лог c выглядит следующим образом.
public void CloseProgressBar()
{
if (_progressWindow != null && _currentDispatcher != null)
{
//Close the window and shutdown the dispatcher.
_currentDispatcher.Invoke(() => CloseWindow());
}
else if(_progressWindow != null && _currentDispatcher == null)
{
_progressWindow.Close();
}
}
/// <summary>
/// CloseWindow
/// </summary>
private void CloseWindow()
{
_progressWindow.Close();
_currentDispatcher.InvokeShutdown();
}
Но при попытке сделать это иногда говорит, что задача уже отменена, или говорит, что задача принадлежит другому потоку. Я не мог понять, проблема в моем коде или в том, как я это делаю?
Любое предложение высоко ценится. Спасибо.