2013-03-12 4 views
2

J'ai un morceau de code qui obtient les instances de serveur disponibles de mon serveur SQL à DataTable. Cela prendra du temps à peupler. J'ai donc essayé d'ajouter une barre de progression pour indiquer cette heure. Il y a des façons de le faire:Progressbar avec une minuterie

travailleur 1.En Contexte
2.Grâce une minuterie

J'ai utilisé une minuterie, mais la barre de progression est pas Animer.

mon code est (WinForm):

private void frmCodeGenerator_Load(object sender, EventArgs e) 
    { 
     Cursor.Current = Cursors.WaitCursor; 
     tmrWaiting.Enabled = true; 
     tmrWaiting.Start(); 

     //List all available servers 
     PopulateServerInstances(); 
     //List all default namespaces to import 

     //Set the target folder default path tec. 

     tmrWaiting.Stop(); 
     Cursor.Current = Cursors.Default; 
    } 

private void tmrWaiting_Tick(object sender, EventArgs e) 
     {    
      pbWaiting.Value++; 
     } 

Le curseur est en train de changer la forme normale à waitstate mais la barre de progression n'a pas. Est-ce que je fais du wright?

+0

Avez-vous défini 'pbWaiting.Maximum'? – Nolonar

+0

Oui. De l'éditeur de propriété de studio visuel. 'pbWaiting.Maximum = 100' et' pbWaiting.Visible = true' – Irshad

+0

Quel INTERVAL utilisez-vous? Si elle est trop grande, il se peut qu'elle ne se déclenche pas au moment où la tâche est terminée. En outre, cela comptera juste indépendamment de la progression réelle? Est-ce juste un code fictif? – Belogix

Répondre

2

Votre gestionnaire d'événements Load, qui s'exécute sur votre thread d'interface utilisateur, appelle le PopulateServerInstances, qui bloque probablement le chargement des données. Vous devez effectuer ce travail sur un thread BG afin que votre thread d'interface utilisateur puisse continuer à mettre à jour l'interface utilisateur. BackgroundWorker est votre meilleur choix, car il inclut la prise en charge de la mise à jour des informations de progression sur le fil de l'interface utilisateur au fur et à mesure.

+0

Je ne suis pas sûr du gestionnaire d'événements 'Load'. J'ai un Winforms qui fait la majeure partie de son travail dans son événement 'Load', et la barre de progression fonctionne correctement (bien que la barre de progression soit mise à jour dans le thread d'arrière-plan via un délégué) – Nolonar

+0

comme point supplémentaire, votre formulaire ne sera pas affiché avant la fin de la méthode populate. – fofik

+0

@Nolonar: cela n'a de sens que si vous appelez périodiquement 'Application.DoEvents()' pour pomper tous les événements de l'interface utilisateur, ou si votre gestionnaire a été d'une manière ou d'une autre dirigé vers un autre thread. –