2012-06-27 50 views
0

我不知道如何正确命名问题。请免费做编辑。触发12小时循环

我有一个后台控制台应用程序在我的服务器上运行。控制台应用程序会不时发送电子邮件并执行一些小操作(每5分钟一次)。

应用程序不是每5分钟通过任务管理器启动,它在安装过程中打开一次,并且无限循环和thread.sleep保持运行。因此,我无法将任务管理器配置为使用特定参数打开应用程序。

现在我需要添加一个任务来每12小时运行一次,并且我想使用相同的应用程序。该任务包括删除并创建几个文件,但检查自上次创建以来基于文件日期是否有12个小时,每5分钟对我来说看起来有点不明智。

是否有一个非常昂贵的方式(没有数据库,没有日志,没有文件创建日期,没有多线程)使用同一个应用程序打勾12小时循环?如果不是,那么最好的办法是什么?

+3

行任务B.东西,你可能看http://quartznet.sourceforge.net/ – Blorgbeard

+0

或者你可以只记得你跑最后一次,并检查如果是12小时前每次5分钟的任务都会收起来。 – Blorgbeard

+0

有没有考虑将其作为服务运行?我知道它没有回答你的问题 - 原始问题的选项 - 创建两个线程 - 每个线程都有自己的计时器对象 - 并为每个任务设置特定的计时器。如果做得正确 - 你可以随后延长到第3 /第4。谨慎使用这两个线程之间的共享资源。 – tsells

回答

1

这里是在午夜UTC调度的有效手段,而不循环:

var now=DateTime.UtcNow; 
var today=now.Date; 
var tomorrow=today.AddDays(1); 
var dueTime=tomorrow-now; 

System.Threading.Timer timer = null; 
timer = new Timer(_ => { 
    try 
    { 
     //do your thing 
    } 
    finally 
    { 
     timer.Dispose(); 
    } 
},null,dueTime,TimeSpan.FromMilliseconds(-1d)) 
1

据我所知,你已经有一个循环,等待5分钟,然后做任务A.现在你想添加任务B每12小时运行一次。我要么用Timer对象替换它们,要么在任务A运行时每5分钟检查一次,看看任务B运行了多久。如果其至少12小时,然后一起运行的

if (last12HourRun.Subtract(DateTime.Now).TotalHours > 12) 
    // run task B 
    last12HourRun = DateTime.Now;