2017-08-09 78 views
0

我有一個windows服務,它執行多個任務,我已將其分離爲多個功能,有些可能需要5分鐘才能完成,有些則需要更少。在windows服務中實現多種功能的正確方法

private System.Timers.Timer tim = null; 
protected override void OnStart(string[] args) 
    { 

     tim = new System.Timers.Timer(); 
     this.tim.Interval = 30000; 
     this.tim.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimedEvent_Tick); 
     tim.Enabled = true; 

    } 
private void OnTimedEvent_Tick(Object source, System.Timers.ElapsedEventArgs e) 
{ 
      Task task0 = Task.Factory.StartNew(() => Function1()); // doing some database operations 
      Task task1 = Task.Factory.StartNew(() => Function2()); // doing some other database operation 
      Task task10 ......Up to Function10() 
      Task.WaitAll(task0,task1, task2, task3, task4,task5, task6,task7,task8,task9,task10); 

} 

有平局回到上面的方法?如果我的Windows服務運行讓我們說每30秒。如果有我如何接近它?

回答

0

由於只有有限數量的任務,因此在您的情況下可以正常工作。對於可以創建的任務數量未知的情況,請考慮使用Parallel.ForEach來代替。你需要處理的事情是例外。把你的代碼放在try .... catch語句中。

try 
      { 
    ....your code here..... 
} 
    catch (AggregateException e) 
      { 
    var x = e.Flatten(); 
    // Log or do what-ever 
    } 
+0

感謝您的回覆,如果Function1/2/3等未完成並且30秒定時器耗盡怎麼辦? – Dexter

+0

你在這裏打電話是一個代表。在裏面你正在創建任務。所以,一旦它開始委託,定時器就沒有什麼可做的了。間隔完成後,它將在另一個線程中再次觸發。處理它的一種方法是,您可以在第一次通話後禁用定時器。之後,在其中運行一個無限循環和代碼。在代碼的最後一行,您可以編寫Thread.Sleep。 https://stackoverflow.com/questions/19151363/windows-service-to-run-a-function-at-specified-time https://stackoverflow.com/questions/18001733/net-multiple-timers-instances-mean - 多線程 – Amit

0

正確的答案取決於這些任務實際上在做什麼。如果所有任務必須在重新啓動任何任務之前完成,請設置tim.AutoReset = false。然後在Task.WaitAll()之後調用tim.Start()。這將確保您的等待時間是完成所有任務之間的時間。否則,如果您的計時器時間小於任務執行時間,則不會看到任何等待時間。

0

如果你的某些函數週期性地比計時器間隔(30秒)花費更長的時間,它將導致線程數增加而沒有任何控制。所以你會通過使用所有可能的線程結束,這會導致處理延遲。如果定時器間隔比處理時間短,可以考慮應用暫停 - 恢復定時器系統