Почему мой индикатор выполнения заставки WPF не синхронизирован с выполнением шагов запуска? - PullRequest
1 голос
/ 17 мая 2010

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

Ответы [ 2 ]

1 голос
/ 22 мая 2010

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

1 голос
/ 17 мая 2010

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

...