Я реализовал простое окно заставки 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();
}
В основном это работает, шаги выполняются, и заставка показывает прогресс. Но я заметил, что заставка по некоторым причинам не обновляет свой контент на всех этапах. По этой причине я назвал диспетчер асинхронным и дождался его завершения. Но даже это не помогло.
Кто-нибудь еще сталкивался с этим или схожим поведением и советует, как синхронизировать обновление заставки с выполнением шагов последовательности загрузки? Я знаю, что пользователи вряд ли заметят это поведение, так как заставка что-то делает, и приложение запускается после завершения загрузки. Но я не сплю хорошо, потому что я не знаю, почему это не работает, как ожидалось ...
Спасибо за помощь,
Denny