2009-11-24 5 views
1

J'essaie de mettre à jour ma barre de progression avec l'arrière-plan. Seulement cela ne marche pas. Voici mon code:La barre de progression de C# ne sera pas mise à jour avec l'arrière-plan

private BackgroundWorker _worker; 

public Form1(string[] args) 
{ 
    InitializeComponent(); 

    // Backgroundworker to update the progressbar 
    _worker = new BackgroundWorker(); 
    _worker.WorkerReportsProgress = true; 
    _worker.ProgressChanged += worker_ProgressChanged; 
    _worker.DoWork += worker_DoWork; 
    _worker.RunWorkerCompleted += worker_WorkCompleted; 

} 

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    SendItems(); 
} 
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
} 
private void worker_WorkCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    _running = false; 
    HandleGui(); 
} 

private bool SendItems() 
{ 
    try 
    { 
     GetEvaluationDocumentsToSend(); 
     _worker.ReportProgress(16); 

     GetModifiedEvaluationDocumentsToSend(); 
     _worker.ReportProgress(32); 

     GetTasksToSend(); 
     _worker.ReportProgress(48); 

     GetPostToSend(); 
     _worker.ReportProgress(64); 

     GetContractDocumentsToSend(); 
     _worker.ReportProgress(80); 

     GetModifiedContractDocumentsToSend(); 
     _worker.ReportProgress(100); 

     return true; 
    } 
    catch (Exception e) 
    { 
     Log.WriteLog(e.ToString()); 

     MessageBox.Show(
      "The following error occured while sending the items: \r\n" + e.ToString(), 
      "Error", 
      MessageBoxButtons.OK, 
      MessageBoxIcon.Exclamation); 

     return false; 
    } 
} 

private void btnUpdate_Click(object sender, EventArgs e) 
{ 
    _worker.RunWorkerAsync(); 
} 

Je ne reçois aucune erreur, mais ma barre de progression ne sera pas mise à jour. Qu'est-ce que je fais mal?

+1

L'événement ProgressChanged se déclenche-t-il réellement? – GenericTypeTea

+0

Oui. Lorsque je définis un point d'arrêt sur l'appel de méthode et l'événement progressChanged que d'abord la méthode est exécutée, puis l'événement progressChanged. – Martijn

+2

J'ai testé votre code et cela fonctionne très bien. Avez-vous autre chose qui définit la valeur de la barre de progression? En outre, quelles sont les valeurs min et max pour votre barre de progression? –

Répondre

3

Eh bien, cela fonctionne sur ma machine. Que fait GetEvaluationDocumentsToSend()? Peut-être que cela prend beaucoup plus de temps que les autres méthodes, donc il semble qu'aucun progrès n'est fait parce que tout le progrès est presque instantané? Aussi, que fait HandleGui() et à quoi sert _running?

2

Vous n'avez pas démarré BackgroundWorker!

Ajouter cette ligne après les abonnements aux événements:

_worker.RunWorkerAsync(); 

EDIT: Maintenant, le code montre que vous appelez la RunWorkerAsync()

Essayez d'ajouter Thread.Sleep (1000) après chaque progrès pour voir si le processus est trop rapide ...

+1

Je suis désolé, j'ai oublié de mentionner cela dans mon code. Je vais mettre à jour mon startpost. – Martijn

0

essayer d'ajouter un appel Invoke/BeingInvoke autour de votre mise à jour progressbar:

this.BeginInvoke((MethodInvoker)delegate 
{ 
    progressBar1.Value = e.ProgressPercentage; 
}); 

C'est généralement la raison pour laquelle les interfaces utilisateur ne sont pas mises à jour.

+2

Tout le point de l'arrière-plan travailleur est qu'il prend soin de cela. – configurator

+1

ATTENTION Appelez toujours EndInvoke après la fin de votre appel asynchrone. http://msdn.microsoft.com/en-us/library/2e08f6yc%28VS.71%29.aspx –

+0

Point équitable. Je le ferais toujours par habitude. Dans ce cas, je ne peux pas comprendre pourquoi son code ne fonctionne pas, donc je ne fais que donner une posibilité. –

Questions connexes