Comment puis-je utiliser multithreading dans une application Windows Forms pour mettre à jour une barre de progression?

StackOverflow https://stackoverflow.com/questions/2596039

Question

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.

Dans l'objet de l'algorithme, il est 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 commence une série d'étapes dans l'objet de l'algorithme. Comme chaque pas (ou sous-étapes) se produit, l'événement se déclenche ProgressChanged, et dans la fenêtre il y a un gestionnaire d'événements qui augmente sensiblement la barre de progression par rapport à la propriété de progression.

Le problème que je suis en cours d'exécution en est que, parce que l'algorithme a une possibilité (et haute liklihood) de l'exécution d'un temps relativement long, je dois le déplacer dans son propre fil d'arrière-plan et pousser l'événement de retour à la fenêtre.

Mon problème est que je ne suis pas tout à fait sûr de ce que je fais en ce qui concerne le multi-threading. Je l'ai regardé Control.Invoke et je suis un peu perdu.

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

Était-ce utile?

La solution

Utilisez un BackgroundWorker. Il a une méthode ReportProgress + événement pour vous permettre d'exécuter la barre de progression w / o se soucier de Invoke.

Autres conseils

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;
}

Comme dit l'autre affiche, utilisez un composant BackgroundWorker. Explication et exemple de code sur: http://ondotnet.com/ pub / a / dotnet / 2005/07/25 / backgroundworker.html

-Oisin

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top