2017-08-09 79 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秒)花费更长的时间,它将导致线程数增加而没有任何控制。所以你会通过使用所有可能的线程结束,这会导致处理延迟。如果定时器间隔比处理时间短,可以考虑应用暂停 - 恢复定时器系统