2008-10-29 9 views
1

Étant donné un System.Timers.Timer, existe-t-il un chemin à partir du thread principal pour savoir si le thread de travail exécutant le code d'événement écoulé est toujours en cours d'exécution? En d'autres termes, comment s'assurer que le code en cours d'exécution dans le thread de travail n'est pas en cours d'exécution avant d'arrêter le temporisateur ou le thread principal de l'application/service dans lequel le temporisateur s'exécute?Indique si le thread d'événement 'écoulé' est toujours en cours d'exécution?

S'agit-il d'une temporisation de minuterie pour l'enfilage de la minuterie à l'aide de l'état, ou est-il juste temps d'utiliser les filetages directement?

Répondre

1

Levez les yeux vers ManualResetEvent, comme il est fait de faire précisément ce que vous demandez. Vos threads créent un nouvel événement de réinitialisation et l'ajoutent à une file d'attente accessible que votre thread principal peut utiliser pour voir si des threads sont toujours en cours d'exécution.

// main thread owns this 
private List<ManualResetEvent> _resetEvents; 
... 
// main thread does this to wait for executing threads to finish 
WaitHandle.WaitAll(_resetEvents.ToArray(), 2000, false) 
... 
// worker threads do this to signal the thread is done 
myResetEvent.Set(); 

Je peux vous donner un code plus exemple si vous voulez, mais je fondamentalement juste copié des articles couple que j'ai lu quand je devais le faire il y a un an.


oublié de mentionner, vous ne pouvez pas ajouter cette fonctionnalité aux threads par défaut que vous obtiendrez lorsque vos feux de minuterie. Vous devriez donc faire en sorte que votre gestionnaire de minuterie soit très léger et ne rien faire de plus que préparer et démarrer un nouveau thread de travail.

... 
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorkerDelegate), 
    myCustomObjectThatContainsAResetEvent); 
+0

Wow. C'était vraiment facile. Merci! – claco

0

Pour la solution prête à l'emploi, il n'y a aucun moyen. La raison principale est que le thread exécutant la fonction TimerCallback est vraisemblablement encore en vie même si le code qui exécute le rappel est terminé. Le TimerCallback est exécuté par un Thread hors du ThreadPool. Lorsque la tâche est terminée, le thread ne meurt pas, mais retourne dans la file d'attente pour la prochaine tâche de pool de threads.

Pour que cela fonctionne, vous devez utiliser une signalisation de type thread-safe pour détecter que l'opération est terminée.

Timer Documentation

Questions connexes