2010-03-08 2 views
0

J'essaye de créer une fenêtre d'état dont le contenu (zone de texte) devrait changer dans une longue opération. Cette fenêtre d'état est appelée et mise à jour à partir de l'application principale. Malheureusement, le contenu n'est mis à jour qu'à la fin de l'opération. J'utilise VS2008, C# et WPF.wpf C# mise à jour de la fenêtre d'état

Merci.

+0

Quelle est votre question exactement? –

Répondre

3

C'est dans une autre réponse pour permettre une meilleure mise en forme:

Le code devrait comme à peu près comme ceci:

BackgroundWorker bgWorker = new BackgroundWorker(); 

bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 

bgWorker.RunWorkerCompleted += new 
    RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); 

bgWorker.RunWorkerAsync(); 

Dans la méthode bgWorker_DoWork, appelez "Dispatcher.Invoke" (ou "Dispatcher.BeginInvoke", dépend dans les circonstances) et le délégué pour l'appel peut mettre à jour votre zone de texte (parce que c'est dans le même fil que la zone de texte).

+0

BackgroundWorker prend déjà en charge la mise à jour de la progression (via BackgroundWorker.ProgressChanged). Pourquoi voudriez-vous ajouter un autre niveau d'indirection avec Dispatcher Invoke/BeginInvoke? – micahtan

1

Si vous appelez un service et que l'appel est synchrone, l'application principale n'a aucune chance de se mettre à jour. Vous devez les mettre sur un fil différent. En outre, si l'appel de service obtient une priorité plus élevée (les threads de l'interface utilisateur ont toujours une priorité moindre), vous devez forcer le système à les mettre à jour.

1

Que diriez-vous de faire une longue opération dans un thread BackgroundWorker et de notifier le contenu de temps en temps en utilisant le Dispatcher? Cela donnera un sentiment réactif et progressif à votre interface utilisateur.

+0

Pourriez-vous s'il vous plaît me donner un exemple sur la façon de faire cela? – phm

Questions connexes