使用Scheduler创建Windows服务?

时间:2012-07-19 11:30:41

标签: c# windows-services

我正在创建一个将自己安装在dobleclick上的Windows Server。但我正在编写核心代码。我面临的问题是

Windows Server将从数据库中获取10条记录并使用WCF服务上传。 现在,在完成这10条记录之后,该服务将再次查看数据库并再次记录10条记录。

但我也在使用Timer,这样这个过程每隔5分钟就会继续。现在,如果在某个时间,使用WCF上传超过5分钟,我必须停止新的执行并等待它完成。

我该怎么做。

4 个答案:

答案 0 :(得分:3)

每次计时器滴答时,禁用它,并在执行结束时再次启用它,以便在最后一次执行结束后5分钟再次打勾。

答案 1 :(得分:1)

这是锁定的理想方案。在下面的示例中,回调将每5分钟触发一次。如果服务仍然在下一个回调触发时处理上一批,它将简单地丢弃它并在5分钟内再次尝试。如果您愿意,可以更改此选项以使回调排队,但是,如果排队太多,则需要警惕线程池饥饿。

您甚至可以将间隔缩短为1分钟,以避免在批次运行的情况下出现任何长时间延迟。

static Timer timer; 
static object locker = new object(); 

public void Start() 
{ 
    var callback = new TimerCallback(DoSomething); 
    timer = new Timer(callback, null, 0, 300000); 
} 

public void DoSomething() 
{ 
    if (Monitor.TryEnter(locker)) 
    { 
       try 
       { 
           // my processing code 
       } 
       finally 
       { 
           Monitor.Exit(locker); 
       } 
    } 
} 

答案 2 :(得分:0)

为什么不在开始做事时设置布尔值(或锁定更好)。

在循环中,检查布尔(或锁定)是否处于活动状态然后跳过,因此下一批将在另外5分钟内运行。

答案 3 :(得分:0)

使用Timer计时五分钟,但请不要重复:

timer = new Timer(state => FetchRecords(), null, 
                    new TimeSpan(0, 5, 0), Timeout.Infinite);

这将在五分钟后调用FetchRecords方法,但不重复(Timeout.Infinite)。

FetchRecords方法结束时,重新启动计时器:

timer.Change(new TimeSpan(0, 5, 0), Timeout.Infinite);

这将再次启动计时器。

只要方法调用在此时间内完成,此模式允许您每5分钟检测一次心跳,但如果方法调用仍在进行中则不勾选。