2010-09-12 12 views
11

Je travaille sur un projet qui crée 20 à 50 nouvelles tâches toutes les 30 à 80 secondes. Chaque tâche dure de 10 à 20 secondes.Redémarrer une tâche ou en créer une nouvelle?

Je suis sur un Timer pour créer ces nouvelles tâches, mais chaque fois que je recréer toujours la même tâche, le code est comme ceci:

public class TaskRunner : IDisposable 
{ 
    private readonly Timer timer; 
    public IService service; 

    public ThreadRunner(IService service) { 
      this.service = service; 
      timer = new Timer(10000); 
      timer.Elapsed += Execute; 
      timer.Enabled = true; 
     } 
    } 

    private void Execute(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      Task.Factory.StartNew(service.Execute); 
     } 
     catch (Exception ex) 
     { 
      logger.ErrorFormat("Erro running thread {0}. {1}", service, ex); 
     } 
    } 

    public void Dispose() 
    { 
     timer.Dispose(); 
    } 
} 

Ma question est, theres un moyen de créer une tâche et en gardant le redémarrer, donc je n'ai pas besoin de commencer une nouvelle tâche Task.Factory.StartNew (service.Execute); à chaque fois?

Ou c'est quelque chose que je n'ai pas à s'inquiéter, et c'est bon de continuer à créer de nouvelles tâches?

Y a-t-il un guide/de bonnes pratiques sur la façon dont je devrais travailler sur ce scénario, avec ce genre de threads?

+0

Vous utilisez _Tasks_, pas _Threads_. fait toute la différence ici. –

+0

'Task.Factory.StartNew' ne" démarre pas un nouveau thread "(généralement) –

+0

Ok, j'ai compris. La question devient "Devrais-je créer une nouvelle tâche à chaque fois, ou puis-je la redémarrer?" –

Répondre

8

Votre méthode Execute s'exécute déjà sur un thread. Un thread de pool de threads qui a été démarré par le System.Timers.Timer que vous utilisez pour augmenter l'événement Elapsed. Ne commencez pas un autre fil, utilisez simplement celui qui vous a été remis. Threadpool threads sont très bon marché et recycler automatiquement.

1

Plutôt que de redémarrer chacun des threads lorsque le temporisateur se déclenche, pourquoi chaque thread exécute-t-il une boucle qui exécute le code spécifié à la fréquence requise?

7

A la question révisée:

dois-je créer une nouvelle tâche à chaque fois, ou puis-je redémarrer juste?

La réponse devrait être très claire: Oui, utilisez une nouvelle à chaque fois. N'essayez en aucun cas de réutiliser une tâche, plus l'utilisation est courte, mieux c'est.

Alors que les threads sont très coûteux à créer, les tâches utilisent déjà le ThreadPoool pour résoudre ce problème. N'interférez pas avec cela, vous n'aurez que des problèmes.