在Windows服务中实现多个功能的正确方法



我有一个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 秒运行一次。如果有,我该如何处理?

这在您的情况下可以正常工作,因为任务数量有限。 对于可以创建的任务数未知的情况,请考虑改用 Parallel.ForEach。您需要在这里处理的事情是异常。试试你的代码。捕获语句。

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

正确答案将取决于这些任务实际在做什么。 如果在重新启动任何任务之前必须完成所有任务,请设置 tim。自动重置 = 假。 然后在 Task.WaitAll(( 之后调用 tim。开始((。 这将确保您的等待时间在所有任务的完成执行之间。 否则,如果计时器时间小于任务执行时间,则不会看到任何等待时间。

如果某些函数周期性地花费的时间超过计时器间隔(30 秒(,则会导致线程计数在没有任何控制的情况下增加。因此,您将使用所有可能的线程来结束,这将导致处理延迟。如果计时器间隔短于处理时间,请考虑应用暂停-恢复计时器系统

最新更新