日期:2014-05-17  浏览次数:20715 次

关于开发 windows 服务的小疑问
打算做个 windows 服务程序。

服务内容是 计划任务。

计划任务的多少是存在数据库里的,最快的执行任务 ,需要几秒就执行一次。

我想的是减轻对数据库的压力,在文件夹生成xml 任务的副本。

然后服务扫描文件夹。。


疑问:这个扫描的过程可能几秒就一次,这样的服务是不是太耗费系统资源?应该怎么设计呢?

------解决方案--------------------
  没看懂要干啥,感觉大致是,几秒钟去查下数据库,得出所有任务,再对比当前时间,然后决定是否运行程序。不知对否?当然,这样可以实现功能。
  先不考虑系统压力是否特别大,这个算法的确开销不小。举个例子,你下了个陷阱捕老虎,隔几秒就瞄一眼,老虎来了,拉线。这个没问题,但是,老虎如果是三天后出现,那你前三天就是白等了是不?
  个人感觉使用异步触发解决比较好,你可以做个异步线程挂起,没有情况一切风平浪静,一踩入开关就触发,开关可以是监控IO,看看是否有向指定文件夹读写东西的操作,也可以直接使用SQL的触发器(推荐这个),有就触发。虽然开关也可能用到死循环侦听,但是代价相对全遍历要小的多
------解决方案--------------------
整理一下,这样说吧,A、B两个方法,A方法是你服务需要执行的对象,B方法作为开关,
服务开始了,A方法像B方法提交一个异步请求,并等待返回,B方法得到请求后读取数据库时间,并生成本地时钟,开始对时间进行判定(可以用循环比较),当满足条件时B再次访问数据库确认数据库时间,无误后,B给A返回个信量B停止,A运行。

这样做为了避免两个问题,
1、指定单次时间在运行可能会造成数据冗余,比如你定时5秒,当你的处理方法超过5秒(因为你对文件做全遍历,没那么快),那会怎么样?因为没有返回值,一个新的任务又开始了,一个新线程、又一个数据库查询+又一次新遍历;
2、对于非本机数据库访问频繁,相应的任务响应度不高等