Salut !
J'ai quelques petits soucis en matières de threading
Je vois très bien le principe (enfin je crois :] ), j'arrive sans soucis à créer des thread. Mais je me trouve maintenant à un soucis lorsque que je souhaite associer un Thread à un Timer...
En gros, j'ai une suite de tâche récurrentes à lancer, chacune sur différents intervalles de temps, différents délai de départ, ...
Je pensais lancer pour chaque tâche un Thread, dans lequel je déclencherai un Timer (Systems.Timers.Timer). J'aimerai ensuite laisser tourner mon service tant qu'au moins une des tâches est active.
Voila ce que j'ai fait:
Avec la propriété IsAlive tel que:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 foreach (Worker worker in m_config.Workers) { Thread thread = new Thread(new ThreadStart(worker.Run)); m_threads.Add(thread); thread.Start(); } while (IsAlive) { Thread.Sleep(1000); }
Là déjà je ne suis pas sur de faire quelque chose de correct et sûr?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public bool IsAlive { get { bool alive = true; foreach (Worker worker in m_config.Workers) alive &= worker.IsAlive; return alive; } }
Ensuite, pour la méthode Worker.Run():
Le soucis c'est mon thread lance la méthode Worker.Run(), mais semble ne plus être actif après avoir lancer le Timer? Le Timer serait-il levait dans un autre Thread (m_timer.Elapsed étant levé dans un autre ThreadPool d'après MSDN) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 internal void Run() { m_timer = new System.Timers.Timer(m_waitMinutes * 60000); m_timer.Enabled = true; m_timer.Elapsed += new System.Timers.ElapsedEventHandler(RunInternal); m_timer.Start(); }
Du coup comment garder un contrôle sur le process de mon Worker?
Et bien sur, je souhaiterai pouvoir tuer à tout moment chacun des Worker en cours, j'ai donc fait:
Si quelqu'un maitrisant mieux le sujet sur les Threads que moi pouvait me donner un coup de pouce, ce serai trèèès appréciable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 internal void Stop() { if (m_timer != null) { m_timer.Stop(); m_timer.Close(); m_timer.Dispose(); } }
Merci !
Partager