アプリケーションの起動の進行状況をユーザーに通知する単純な 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 と呼び、その完了を待つ理由です。しかし、これでも役に立ちませんでした。
他の誰かがこれまたは同様の動作を経験し、スプラッシュ画面の更新をブートシーケンスステップの実行と同期させる方法についてアドバイスがありますか? スプラッシュ スクリーンが何かを実行しており、起動が完了するとアプリケーションが起動するため、ユーザーがこの動作に気付く可能性は低いと思います。でも、どうして思うように動かないのか自分でもよく眠れません…。
助けてくれてありがとう、デニー