2010-06-10 12 views
1

J'utilise Visual Studio 2010 et C# et j'essaie d'afficher ma barre de progression, mais cela ne fonctionne pas.BackgroundWorker et Progressbar.Show()

J'écoute un événement. Si cela arrive, je veux faire du travail et montrer une barre de progression tout en faisant cela.

C'est ce que je fais:

static void Main(string[] args) { 
    ProgressForm form = new ProgressForm(); 
    new FileWatcher(form).Start(); 
    Application.Run(); 
} 

ProgressForm: 
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
private void bgWorker_DoWork(object sender, DoWorkEventArgs e) { 
    this.Show(); 
    .... 
} 

mais rien ne montre. Pourquoi ça ne marche pas?

merci bye juergen

Répondre

1

Vous ne pouvez pas utiliser de BGW pour afficher un formulaire, le thread n'a pas l'état approprié. Vous devrez utiliser un Thread pour pouvoir appeler sa méthode SetApartmentState() pour le basculer sur STA. Vous avez également besoin d'une boucle de message sur le thread pour garder le formulaire actif, ce qui nécessite un appel à Application.Run(). Et le formulaire doit être créé sur ce fil. Ainsi:

 var t = new Thread(() => Application.Run(new Form1())); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 

Un gros problème avec cette forme est qu'il ne peut appartenir à une fenêtre sur votre thread d'interface utilisateur. Donner la tendance à disparaître derrière la fenêtre d'une autre application. En outre, votre thread d'interface utilisateur est toujours mort, ses fenêtres seront fantôme avec le message "ne pas répondre" dans leur barre de légende après quelques secondes.

La bonne façon de procéder est la suivante: exécutez le code qui prend du temps sur un autre thread, un BGW serait un très bon choix. Le fil de l'interface utilisateur doit afficher votre formulaire de progression. BackgroundWorker.ReportProgress est idéal pour garder la barre de progression à jour.

+0

Merci pour l'aide les gars! Maintenant ça marche. Le problème principal était que j'ai fait ceci: Application.Run(); au lieu de cela: Application.Run (progressbarForm); Et j'appelle la barre de progression de mon backgroundWorker et ça se voit! au revoir juergen – Juergen

1

Afin de rendre compte des progrès de la BackgroundWorker vous devez appeler ReportProgress méthode du gestionnaire d'événements DoWork et montrer les progrès dans le gestionnaire de BackgroundWorker.ProgressChanged Event

+1

Aussi, je pense que vous devriez définir la propriété "ReportsProgress" à "true". –

+0

J'ai aussi essayé l'événement progresschanged. rien ne se passe. Mais je veux d'abord montrer ma barre de progression, ensuite je veux avancer. – Juergen

+0

J'ai mis le ReportsProgress à true et l'événement se lève mais show ne fait rien. – Juergen

2

Vous ne devez pas modifier la forme de l'interface utilisateur fils d'arrière-plan. Cela devrait être fait uniquement à partir du thread principal. Vous pouvez afficher une barre de progression de base juste avant de démarrer le worker d'arrière-plan et la masquer dans le gestionnaire d'événements RunWorkerCompleted du worker d'arrière-plan. Pour signaler les progrès réels, vous avez besoin d'une implémentation comme suggéré par Giorgi.

+0

c'est exactement ce que je veux faire. mais je regarde pour un fichierChangedEvent. ce n'est pas soulevé dans le fil principal. – Juergen

+0

Je fais ceci: private void OnFileChanged (source de l'objet, FileSystemEventArgs e) { // Si je montre ma barre de progression ici rien ne se passe trop this.backgroundWorker.RunWorkerAsync(); } – Juergen

+0

Que voulez-vous dire par "rien ne se passe"? Essayez de démarrer l'arrière-plan worker backgroundWorker.RunWorkerAsync(); et sur la ligne suivante montre la barre de progression. –