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

时间:2017-08-09 15:56:11

标签: c#

我有一个执行多项任务的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秒。如果有我如何接近它?

3 个答案:

答案 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秒),则会导致线程数增加而无需任何控制。因此,您将使用所有可能导致处理延迟的线程结束。如果定时器间隔短于处理时间,请考虑应用暂停 - 恢复定时器系统