2010-09-12 119 views
11

我正在製作一個項目,每30〜80秒創建一個20〜50個新任務。 每個任務生存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);每次?

或者這就是我不必擔心的事情,可以繼續創建新的任務嗎?

Theres關於如何在這種情況下使用那種線程工作的任何指南/最佳實踐?

+0

您正在使用_Tasks_,而不是_Threads_。在這裏有所不同。 – 2010-09-12 20:59:33

+0

'Task.Factory.StartNew'不會「啓動一個新線程」(通常) – 2010-09-12 21:13:47

+0

好吧,我明白了。問題改爲「我應該每次創建一個新的任務,還是我可以重新啓動它?」 – 2010-09-12 21:35:09

回答

8

您的Execute方法已經在一個線程上運行。一個線程池線程,由您用來提升Elapsed事件的System.Timers.Timer啓動。不要啓動另一個線程,只使用交給你的線程。線程池線程非常便宜並自動回收。

1

而不是在定時器觸發時重新啓動每個線程,爲什麼不讓每個線程運行一個循環,以所需的頻率運行指定的代碼?

7

修訂的問題:

我應該創建一個新的任務,每次,或者我可以重新開始嗎?

答案應該非常清楚:是的,每次都使用一個新的。不要試圖以任何方式重新使用任務,使用越短越好。

雖然創建線程非常昂貴,但任務已經使用ThreadPoool來解決該問題。不要干涉它,你只會引入問題。

相關問題