2010-05-17 1 views
1

Я внедрил простую заставку экрана 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

ответ

1

Наконец-то я нашел простое решение моей проблемы: я выполняю многократные шаги запуска в фоновом работнике! Это дало ответную реакцию ui на его отзывчивость ...

1

моя догадка приоритет операции обновления. Как видите, hereDispatcherPriority.Background имеет только значение 4. Он будет выполнен после других действий, стоящих перед ним.
Думаю, это поможет, если вы используете DispatcherPriority.Normal.

+0

Я пробовал несколько приоритетов диспетчера - нормальный среди них - но поведение такое же. В любом случае, поскольку метод обновления ожидает возврата диспетчера, приоритет не должен иметь значения. – dchowitz

+0

Хорошо. Хм, любопытство ... почему вы ждете, когда диспетчер вернется? Я думаю, что это необязательно, потому что другие последующие вызовы будут поставлены в очередь позже, потому что все они имеют одинаковый приоритет. – DHN

+0

Я жду диспетчера, потому что я думал, что будет гарантировать, что индикатор выполнения и информация о состоянии во всплывающем экране всегда соответствуют шагу загрузки seq, который в настоящее время выполняется. – dchowitz

 Смежные вопросы

  • Нет связанных вопросов^_^