Bonsoir,

Je rencontre un problème et là franchement depuis le temps que je cherche, je suis complètement perdu :-(
Je ne maitrise pas vraiment les notions de classes dérivées mais je me suis dit, rien de tel qu'un cas concret pour apprendre.
Mon problème est le suivant. Je souhaite mettre à jour une progressbar via un backgroundworker et ca c'est pas un soucis. J'utilise la méthode ReportProgress du BGW qui appelle l'événement ProgressChanged, qui lui, met à jour la progressbar. Je voulais juste ajouter dans le form un truc du genre "traitement de l'enregistrement x sur y", mais pour ça il ne me faut pas seulement le pourcentage mais les fameux x et y.
Je me suis donc dit, tiens je vais essayer de faire un truc bien, enfin je pense que c'est un truc bien...
J'ai donc créé la classe suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
public class BackgroundWorkerModified : System.ComponentModel.BackgroundWorker
    {
        public event ProgressEventHandler ProgressEvent;
        public virtual void OnProgressEvent(ProgressEventArgs e)
        {
            ProgressEvent(this, e);
        }
        public void ReportAllProgress(int valueToTreat, int nbValues)
        {
            ProgressEventArgs args = new ProgressEventArgs(valueToTreat, nbValues);
            this.OnProgressEvent(args);
        }
    }
et celle-ci qui est censée me récupérer mes x et y dans l'événement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ProgressEventArgs : EventArgs
    {
        private int actualValue;
        private int totalValues;
 
        public ProgressEventArgs(int currentValue, int nbValues)
        {
            this.actualValue = currentValue;
            this.totalValues = nbValues;
        }
        public int CurrentValue
        {
            get { return this.actualValue; }
        }
        public int NbValues
        {
            get { return this.totalValues; }
        }
    }
Dans le code de mon formulaire j'utilise donc le délégué :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public delegate void ProgressEventHandler(object sender, ProgressEventArgs e);
et à l'initialisation du form je lance tout çà :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.ProgressEvent+=new ProgressEventHandler(backgroundWorker1_ProgressEvent);
            backgroundWorker1.RunWorkerAsync();
Dans mon backgroundWorker1_DoWork, j'appelle ma méthode crée précédemment :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
backgroundWorker1.ReportAllProgress(i, nbLines);
et mon événement backgroundWorker1_ProgressEvent est donc le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
private void backgroundWorker1_ProgressEvent(object sender, ProgressEventArgs e)
        {
            progressBar1.Value = ((int)((float)e.CurrentValue / (float)e.NbValues * 100));
        }
C'est sur cette ligne que j'ai l'erreur inter-threads.
Je sais que je pourrais parvenir à mes fins différemment, ce n'est pas l'objet de ce post.
Je cherche à comprendre pourquoi cela fonctionne avec la méthode ReportProgress du BGW et pas avec celle de la classe dérivée BackgroundWorkerModified de celui-ci.
Je vous remercie par avance de votre éclaircissement, notamment car je ne suis pas sûr de ce que je fais dans la gestion des événements ou de la classe dérivée.

Bonne soirée.