2010-09-12 7 views
11

Я работаю над проектом, который создает 20 ~ 50 новых задач каждые 30 ~ 80 секунд. Каждая задача выполняется в течение 10-20 секунд.Перезапустить задачу или создать новую?

Так я использую Timer, чтобы создать эти новые задачи, но каждый раз, когда я всегда воссоздает ту же самую задачу, код выглядит так:

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(); 
    } 
} 

Мой вопрос, Theres ли способ создать задачу и перезапускать его, поэтому мне не нужно начинать новую задачу. Task.Factory.StartNew (service.Execute); каждый раз?

Или это то, о чем мне не о чем беспокоиться, и нормально продолжать создавать новые задачи?

Есть ли какое-либо руководство или рекомендации по работе с этим сценарием, с такими потоками?

+0

Вы используете _Tasks_, а не _Threads_. здесь все имеет значение. –

+0

'Task.Factory.StartNew' не запускает новый поток (обычно) –

+0

Хорошо, я понял. Вопрос меняется на «должен ли я создавать новую задачу каждый раз, или я могу просто перезапустить ее?» –

ответ

8

Ваш метод Execute уже работает по потоку. Нить threadpool, которая была запущена System.Timers.Timer, которую вы используете, чтобы поднять событие Elapsed. Не запускайте другой поток, просто используйте тот, который вам был передан. Нити Threadpool очень дешевы и автоматически перерабатываются.

1

Вместо того, чтобы перезапускать каждый из потоков при срабатывании таймера, почему бы не каждый поток запустить цикл, который запускает указанный код на требуемой частоте?

7

К пересмотренным вопрос:

я должен создать новую задачу каждый раз, или я могу просто перезагрузить его?

Ответ должен быть очень четким: да, используйте каждый раз каждый раз. Не пытайтесь каким-либо образом повторно использовать задачу, чем короче, тем лучше.

Хотя потоки очень дороги для создания, задачи уже используют ThreadPoool для решения этой проблемы. Не вмешивайтесь в это, вы только вводите проблемы.

Смежные вопросы