Bonjour à tous*;

Suis sous Seven avec 8GO Ram 1TO en DD …

Je fais de la petite programmation sous Visual Studio 2008 Standart en C#.
Dans un formulaire WindowsForm … entre autre une Listbox nommé lb_util où j'écris le déroulement des actions du programme. C'est là que se situe le problème.
But du programme*: lancer des décompressions de fichiers. Chaque décompression est exécuté par un Thread différent.
J'ai fait plusieurs essais*:
1) Essai par Utilisation d'un tableau de Thread (t_thread[]) où chaque thread est lancé pour exécuter la méthode «* decompresser()*». Cette dernière méthode doit signaler son action par écriture dans la ListBox.

morceaux de code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
            // lancement d'un thread
          Arg_decompress arg_decompress = new Arg_decompress(i, fichier);   // arguments
 
t_thread[i] = new Thread(new ParameterizedThreadStart(this.decompresser));
                 t_thread[i].Start(arg_decompress);
…............// methode pour decompresser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
void... decompresser(objet data)
     {
     // déclaration et init d'un délégué de type Del_affich chargé d’écrire dans la ListBox (méthode Invoke() )
// la méthode "del_method_aff_lb() est appelée par le délégué
     …...
          Del_affich del_af_lb = new Del_affich(del_method_aff_lb);
              this.lb_util.Invoke(del_af_lb, txt);     // c'est là que ça plante grave 
      …....
        }
 
        // methode exécutée par le délégué sur la ListBox
 public void del_method_aff_lb(string t)
        {         …...this.lb_util.Items.Add(t);…......}
Si je supprime l'appel du délégué (Invoke) le programme est OK.

2) Essai par utilisation d'un pool de Thread (ThreadPool) au lieu du tableau de Thread
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
....     ThreadPool.QueueUserWorkItem(new WaitCallback( decompresser ), arg_decompress);   
   ....
Le reste du code ne change pas.
Chaque Thread du pool «*décompresse*» un fichier et doit écrire dans la ListBox via un délégué par Invoke(). Même punition, plantage au niveau du Invoke().

3) Essai par utilisation d'un seul Thread*:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
  ....   Thread    th = new Thread(new ParameterizedThreadStart(this.decompresser)); .....
et là tout se passe correctement.

Info supplémentaire*sur le plantage: aucune exception n'est levée … l'application ne répond pas
Dans les deux premiers essais, si je supprime la ligne Invoke(délégué, texte à ecrire) tout est OK.
Même en mode «*Deboggage*» aucune piste , … délégué bien initialisé …

Grand merci à vous pour votre aide