我有一个执行多项任务的Windows服务,我已将其分为多个功能,有些会让我们说5分钟完成,而有些则需要更少。
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 :(得分:0)
这样在你的情况下可以正常工作,因为任务数量有限。对于可以创建的任务数量未知的情况,请考虑使用Parallel.ForEach。你需要处理的事情是异常。将您的代码放在try .... catch语句中。
try
{
....your code here.....
}
catch (AggregateException e)
{
var x = e.Flatten();
// Log or do what-ever
}
答案 1 :(得分:0)
正确的答案取决于这些任务实际在做什么。如果必须在重新启动任何任务之前完成所有任务,请设置tim.AutoReset = false。然后在Task.WaitAll()之后调用tim.Start()。这将确保您的等待时间介于所有任务的完全执行之间。否则,如果您的计时器时间小于任务执行时间,您将看不到任何等待时间。
答案 2 :(得分:0)
如果某些功能会定期花费超过定时器间隔(30秒),则会导致线程数增加而无需任何控制。因此,您将使用所有可能导致处理延迟的线程结束。如果定时器间隔短于处理时间,请考虑应用暂停 - 恢复定时器系统