BackgroundWorker pose un problème en C # lors de l'ajout d'un élément dans la Listbox?

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

Question

J'ai une liste de sélection dans laquelle je dois donner au minimum 2 fichiers pour la fusion. la fusion est terminée lorsque je clique sur le bouton Fusionner. La barre de progression commence et le message qui s'affiche indique que les fichiers ont été fusionnés.Je fais appel à un arrière-plan pour exécuter la barre de progression.

Le problème vient du moment où la fusion est effectuée avec 2 fichiers. J'ajoute un fichier de plus. Cliquez sur le bouton de fusion. la fusion est terminée. le message apparaît. Je clique sur OK dans la zone de message. La boîte de dialogue apparaît à nouveau avec le même message que la fusion été fait. Cette boîte de message continue à apparaître le nombre de fois que j’ajoute le fichier dans la liste.

Par exemple, pour 2 fichiers, un message apparaît 1 jour après l'ajout d'un message supplémentaire, un message supplémentaire apparaît, un fichier supplémentaire dans la zone de liste apparaît, 3ic. Comme si cela continuait ...

Quand j’ai utilisé le débogueur pour le suivre, j’ai remarqué que mon événement Background Worker Runcompleted est appelé autant de fois que j’ajoute un fichier dans la liste déroulante.Voici le code du bouton Fusionner Cliquez sur un événement ...

Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted +=
    new  RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);
Worker.WorkerSupportsCancellation = true;

if (!Worker.IsBusy)
    Worker.RunWorkerAsync();
else
    MessageBox.Show("Cannot run background worker twice ");

if (Worker.IsBusy)
{
    progress = new ProgressDialogDTB();
    progress.FormClosing += 
        new FormClosingEventHandler(ProgressDialog_FormClosing);
    progress.ShowDialog(this);
}
while (Worker.IsBusy)
{
    Application.DoEvents();
}

//For Background Worker completed Event...
private void Worker_RunWorkerCompleted(object sender, 
    AsyncCompletedEventArgs e)
{            
    if (progress != null)
    {
        progress.Close();
        progress = null;
    }
    if ( e.Cancelled )
        MessageBox.Show(" Progress was cancelled ");                               

    if (e.Error == null)
        if (!e.Cancelled)
            MessageBox.Show("Files has been merged ");

    if (e.Error != null)
        MessageBox.Show(e.Error.Message);     
}//Worker_RunWorkerCompleted

Je ne sais pas où je me trompe. S'il vous plaît aider ... Merci ...

Était-ce utile?

La solution

Je suppose que vous cliquez sur chaque bouton de fusion pour enregistrer un nouveau délégué. Si le code suivant:

Worker.DoWork += new System.ComponentModel.DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerCompleted += new  System.ComponentModel.RunWorkerCompletedEventHandler(Worker_RunWorkerCompleted);

se trouve dans le gestionnaire d'événements de clic du bouton Fusionner, envisagez de le déplacer vers votre méthode d'initialisation de formulaire. Vous devez seulement inscrire un délégué une fois. La prochaine fois que vous le ferez, il en ajoutera un nouveau. Ainsi, lors de la deuxième fusion, il sera exécuté deux fois, puis une troisième fois, trois fois, et ainsi de suite.

Autres conseils

Si votre opérateur est une variable de niveau module et que vous ajoutez à sa liste d'appels chaque fois que le bouton est cliqué, cette méthode sera invoquée à chaque fois. Disons que vous cliquez 3 fois, puis ce code Worker.RunWorkerCompleted + =     new RunWorkerCompletedEventHandler (Worker_RunWorkerCompleted); sera exécuté 3 fois et sera appelé 3 fois. Définissez le gestionnaire Terminé une fois lorsque vous instanciez l'objet de travail.

Bah! Battu à elle!

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