【问题标题】:Why is my WPF splash screen progress bar out of sync with the execution of the startup steps?为什么我的 WPF 闪屏进度条与启动步骤的执行不同步?
【发布时间】:2010-05-17 10:14:30
【问题描述】:

我已经实现了一个简单的 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();
}

在这主要工作中,步骤被执行并且启动屏幕显示进度。但我观察到,由于某些原因,闪屏并没有更新所有步骤的内容。这就是我调用 Dispatcher async 并等待其完成的原因。但即使这样也无济于事。

有没有其他人遇到过这种或类似的行为,并且有一些建议如何使启动屏幕的更新与启动顺序步骤的执行保持同步?我知道用户不太可能注意到这种行为,因为启动屏幕正在执行某些操作,并且应用程序在启动完成后启动。但是我自己睡得不好,因为我不知道为什么它没有按预期工作......

感谢您的帮助, 丹尼

【问题讨论】:

    标签: c# .net wpf splash-screen


    【解决方案1】:

    我的猜测是更新操作的优先级。如您所见,hereDispatcherPriority.Background 仅具有值4。它将在它之前排队的其他操作之后执行。
    我认为,如果您使用DispatcherPriority.Normal,它应该会有所帮助。

    【讨论】:

    • 我已经尝试了几个调度程序优先级 - 其中正常 - 但行为是相同的。无论如何,由于更新方法等待调度程序返回,优先级应该无关紧要。
    • 好的。嗯,古玩……你为什么要等调度员回来?我认为没有必要,因为后面的其他呼叫将在稍后排队,因为它们都具有相同的优先级。
    • 我等待调度程序,因为我认为这将确保启动屏幕中的进度条和状态信息始终对应于当前正在执行的引导序列步骤。
    • 好的,我理解你的意图。但是你真的认为这是必要的吗?启动画面仅用于显示“是的,我还活着”。我正在做某事。我不认为它必须是同步的。此外,您使用它会减慢您的启动速度,因为您调用然后等待结束。但是此时其他几个动作可能会排队并在之前执行。这不是一个好主意,不是吗?
    • 您完全正确 - 没有必要让启动画面保持同步。从开发人员的角度来看,我只是对屏幕无法按预期工作的原因感到好奇。让我们结束这个案子,寻找其他更值得浪费的东西......ähem......花时间。感谢您的 cmets!
    【解决方案2】:

    最后,我找到了解决问题的简单方法:我在后台工作程序中执行耗时的启动步骤!这让 ui 线程恢复了响应能力......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2017-06-19
      相关资源
      最近更新 更多