2010-04-07 6 views
2

Il y a deux objets. Le formulaire Windows avec un bouton et une barre de progression, et un autre objet qui gère un algorithme.Comment puis-je utiliser multithreading dans une application Windows Forms pour mettre à jour une barre de progression?

Dans l'objet d'algorithme, il existe un événement et une propriété. L'événement est ProgressChanged et la propriété est Progress (qui est un int).

Dans la fenêtre d'appel, le bouton démarre un ensemble d'étapes dans l'objet d'algorithme. À mesure que chaque étape (ou sous-étape) se produit, l'événement ProgressChanged se déclenche et, dans la fenêtre, un gestionnaire d'événements incrémente essentiellement la barre de progression relative à la propriété Progress. Le problème que je rencontre est que parce que l'algorithme a une possibilité (et une grande probabilité) de fonctionner relativement longtemps, je dois le déplacer dans son propre thread d'arrière-plan et repousser l'événement à la fenêtre.

Mon problème est que je ne suis pas complètement sûr de ce que je fais quand il s'agit de multi-threading. J'ai regardé Control.Invoke et je suis un peu perdu.

Quelqu'un peut-il me diriger dans la bonne direction?

Répondre

3

Utilisez un arrière-plan. Il a une méthode ReportProgress + événement pour vous permettre d'exécuter la barre de progression sans se soucier de Invoke.

+0

Ce semble être la solution. Merci! –

1

Voici un exemple de la façon d'utiliser Invoke pour passer au fil de l'interface utilisateur, où il est sûr de contrôles d'accès:

// In some form method, setup the event handler 
algorithm.ProgressChanged += new EventHandler(AlgorithmProgressChanged); 

private void AlgorithmProgressChanged(Object source, EventArgs args) 
{ 
    if (this.InvokeRequired) 
    { 
     // Switch to the UI thread 
     this.Invoke(new EventHandler(AlgorithmProgressChanged), source, args); 
     return; 
    } 
    // It should be safe to set the progress beyond this point. 
    progressBar.Value = algorithm.Progress; 
} 
Questions connexes