J'ai implémenté une fenêtre d'écran de démarrage WPF simple qui informe l'utilisateur de la progression du démarrage de l'application.Pourquoi ma barre de progression de l'écran de démarrage WPF n'est-elle pas synchronisée avec l'exécution des étapes de démarrage?
Les étapes de démarrage sont définies ainsi:
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
etc. sont des méthodes définies ailleurs, qui effectue certaines tâches chronophages.
La séquence de démarrage est exécuté de cette façon:
foreach (var step in bootSequence)
{
_status.Update(step.Message);
step.Do();
}
_status
désigne une instance de ma fenêtre d'écran de démarrage XAML contenant une barre de progression et une étiquette pour obtenir des informations d'état. Sa méthode Update()
est définie comme suit:
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();
}
Dans le principal cela fonctionne, les étapes s'exécuté et l'écran de démarrage affiche la progression. Mais j'ai observé que l'écran de démarrage pour certaines raisons ne met pas à jour son contenu pour toutes les étapes. C'est la raison pour laquelle j'ai appelé le Dispatcher async et j'attends qu'il soit terminé. Mais même cela n'a pas aidé.
Quelqu'un d'autre a-t-il eu ce comportement ou un comportement similaire et a-t-il des conseils sur la façon de synchroniser la mise à jour de l'écran de démarrage avec l'exécution des étapes de la séquence d'amorçage? Je sais que les utilisateurs ne remarqueront probablement pas ce comportement, car l'écran de démarrage est en train de faire quelque chose et l'application démarre une fois le démarrage terminé. Mais moi-même ne dort pas bien, parce que je ne sais pas pourquoi il ne fonctionne pas comme prévu ...
Thx pour votre aide, Denny
J'ai essayé plusieurs priorités de répartiteurs - normales parmi elles - mais le comportement est le même. Quoi qu'il en soit, puisque la méthode de mise à jour attend le retour du répartiteur, la priorité ne devrait pas avoir d'importance. – dchowitz
Ok. Hmm, bibelots ... pourquoi attendez-vous sur le répartiteur pour revenir? Je pense que ce n'est pas nécessaire, car les autres appels suivants seront mis en attente plus tard parce qu'ils ont tous la même priorité. – DHN
J'attends sur le répartiteur parce que je pensais que cela assurerait que la barre de progression et les informations d'état dans l'écran de démarrage correspondent toujours à l'étape de démarrage qui est actuellement en cours d'exécution. – dchowitz