1

アプリケーションの起動の進行状況をユーザーに通知する単純な 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 と呼び、その完了を待つ理由です。しかし、これでも役に立ちませんでした。

他の誰かがこれまたは同様の動作を経験し、スプラッシュ画面の更新をブートシーケンスステップの実行と同期させる方法についてアドバイスがありますか? スプラッシュ スクリーンが何かを実行しており、起動が完了するとアプリケーションが起動するため、ユーザーがこの動作に気付く可能性は低いと思います。でも、どうして思うように動かないのか自分でもよく眠れません…。

助けてくれてありがとう、デニー

4

2 に答える 2

1

最後に、問題の簡単な解決策を見つけました。時間のかかる起動手順をバックグラウンドワーカーで実行します。これにより、UIスレッドの応答性が回復しました...

于 2010-05-22T19:09:35.807 に答える
1

私の推測では、更新操作の優先度です。ご覧のとおり、ここ DispatcherPriority.Backgroundには値のみがあります4。その前にキューに入れられた他のアクションの後に実行されます。
を使えば助かると思いますDispatcherPriority.Normal

于 2010-05-17T10:52:35.470 に答える