我正在创建一个将自己安装在dobleclick上的Windows Server。但我正在编写核心代码。我面临的问题是
Windows Server将从数据库中获取10条记录并使用WCF服务上传。 现在,在完成这10条记录之后,该服务将再次查看数据库并再次记录10条记录。
但我也在使用Timer,这样这个过程每隔5分钟就会继续。现在,如果在某个时间,使用WCF上传超过5分钟,我必须停止新的执行并等待它完成。
我该怎么做。
答案 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分钟检测一次心跳,但如果方法调用仍在进行中则不勾选。