Blocage de Thread.Start()

Bonjour,

Je developpe actuellement une application en multithread. Le fonctionnemment est le suivant :

Toutes les 10 sec, une méthode regarde s'il y a des fichiers a traiter.
Si tel est le cas on cree un nouveau thread ( jusqu'a une certaine limite, les autres fichiers sont mis en attente).
La fonction suivante est ensuite appellée, permettant de demarrer un thread libre.
A noter que la methode executee dans chaque thread utilise une librairie VB6.

Le probleme est le suivant :

Dans certains cas le thread principal ( et probablement au moins le worker thread dont il est question ) se bloquent.
En fait, la methode Thread.Start() ne semble jamais se finir. Cela se produit lorsque l'on essaye de creer un nouveau thread par dessus un existant.
(cependant il arrive aussi souvent de pouvoir creer un nouveau thread sur un existant sans qu'il y ait de probleme ).

Cela fait plusieurs jours que je n'arrive à resoudre ce probleme, quelqu'un a une idée ?


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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
private void AlimenterThreads(int fileToLoad, string traitement)
        {
                for (int iy = 0; iy < maxThreadsToLoad; iy++)
                {
                    if (ThreadInProgress[iy] == null || !ThreadInProgress[iy].IsAlive)
                    {
                        log.Debug("thread NULL n°" + iy);
                        log.Debug("Demarrage du thread= " + iy);
                        ThreadInProgress[iy] = null;
                        ThreadInProgress[iy] = new Thread(delegate() { DoWork(fileToLoad, traitement, iy); });
                        ThreadInProgress[iy].IsBackground = true;
                        ThreadInProgress[iy].SetApartmentState(ApartmentState.STA);
                        ThreadInProgress[iy].Name = fileToLoad.ToString();
                        ThreadInProgress[iy].Start();
                        log.Info("Thread " + iy + " Démarré NAME= " + ThreadInProgress[iy].Name);
 
                        break;
                    }
                    else
                    {
                        log.Debug("thread n°" + iy + " " + ThreadInProgress[iy].Name);
                    }
                }
	}
 
 
 
	internal void DoWork(int IdMessage, string Destinataire, int threadNumber)
        {
            try
            {
 
                log.Info("DEBUT : Thread n°" + threadNumber + " du fichier " + IdMessage);
 
                DLLFormatageStandard.AppelProgClass TraitementToRun = new DLLFormatageStandard.AppelProgClass();
 
                TraitementToRun.CallFormate(IdMessage, Destinataire);
 
                log.Info("FIN Thread n°" + threadNumber + " du fichier " + IdMessage);
                lock (thisLockThread2)
                {
                    if (lastThreads.ContainsKey(threadNumber))
                    {
                        lastThreads[threadNumber] = IdMessage;
                        log.Debug("Thread =" + threadNumber + " " + IdMessage + " row changed");
                    }
                    else
                    {
                        log.Debug("Thread =" + threadNumber + " " + IdMessage + " new row");
                        lastThreads.Add(threadNumber, IdMessage);
                    }
                }
 
            }
            catch (Exception ex)
            {
                log.Error("EXCEPTION DURING THE VB PROCESSING Msg= " + ex.Message + " inner= " + ex.InnerException + " "+ex.Source+ " "+ex.TargetSite+" thread= " + threadNumber + " Fichier= " + IdMessage);
                ThreadInProgress[threadNumber] = null;
                CreateResetFile();
            }
 
        }