Я внедрил простую заставку экрана WPF, которая информирует пользователя о ходе запуска приложения.Почему мой индикатор прогресса заставки экрана WPF не синхронизирован с выполнением шагов запуска?
Запуск шаги определены следующим образом:
var bootSequence =
new[]
{
new {Do = (Action) InitLogging, Message = "Init logging..."},
new {Do = (Action) InitNHibernate, Message = "Init NHibernate..."},
new {Do = (Action) SetupUnityContainer, Message = "Init Unity..."},
new {Do = (Action) UserLogOn, Message = "Logon..."},
new {Do = (Action) PrefetchData, Message = "Caching..."},
};
InitLogging
и т.д. методы, определенные в другом месте, которое выполняет несколько трудоемких задач.
Последовательность загрузки запускается на выполнение таким образом:
foreach (var step in bootSequence)
{
_status.Update(step.Message);
step.Do();
}
_status
обозначает экземпляр моего окна экрана-заставки XAML, содержащего индикатор и метку для получения информации о состоянии. Его Update()
метод определяется следующим образом:
public void Update(string status)
{
int value = ++_updateSteps;
Update(status, value);
}
private void Update(string status, int value)
{
var dispatcherOperation = Dispatcher.BeginInvoke(
DispatcherPriority.Background,
(ThreadStart) delegate
{
lblStatus.Content = status;
progressBar.Value = value;
});
dispatcherOperation.Wait();
}
В основном это работа, шаги получить обработанный, а заставка показывает прогресс. Но я заметил, что экран заставки по некоторым причинам не обновляет его содержимое для всех шагов. Именно по этой причине я назвал асинхронный Диспетчер и дождался его завершения. Но даже это не помогло.
Кто-нибудь еще испытал это или подобное поведение, и есть рекомендации, как сохранить синхронизацию экрана заставки при выполнении шагов последовательности загрузки? Я знаю, что пользователи вряд ли заметят это поведение, поскольку экран заставки что-то делает, и приложение запускается после завершения загрузки. Но сам не спит хорошо, потому что я не знаю, почему он не работает, как ожидалось ...
Thx за вашу помощь, Denny
Я пробовал несколько приоритетов диспетчера - нормальный среди них - но поведение такое же. В любом случае, поскольку метод обновления ожидает возврата диспетчера, приоритет не должен иметь значения. – dchowitz
Хорошо. Хм, любопытство ... почему вы ждете, когда диспетчер вернется? Я думаю, что это необязательно, потому что другие последующие вызовы будут поставлены в очередь позже, потому что все они имеют одинаковый приоритет. – DHN
Я жду диспетчера, потому что я думал, что будет гарантировать, что индикатор выполнения и информация о состоянии во всплывающем экране всегда соответствуют шагу загрузки seq, который в настоящее время выполняется. – dchowitz