System.Threading.Timers VS Windows服务VS计划任务

时间:2010-12-22 12:36:39

标签: .net

对于应该每小时完成的任务,您建议哪一个以及为什么? 由于系统正在运行具有高CPU和内存以及I / O负载的实时应用程序,我想要最好的方法,以最小的开销来检查是否是时候完成任务了!

编辑:任务可能需要一个多小时来执行它的工作,所以它不应该被触发两次。

编辑:我有一个应用程序,它在磁盘和网络上进行大量的图像处理和I / O.该任务既可以包含在本应用程序中,也可以作为外部应用程序包含。

2 个答案:

答案 0 :(得分:1)

取决于。一般来说 - 任务是实时应用程序的一部分吗?然后,触发处理的计划任务或system.threading.timer可能是相关的。 Windows服务毫无意义,因为你已经拥有一个。

示例:

  • 每小时定期合并未结头寸的金融交易应用程序。交易应用程序是一个Windows服务。我可以jsut使用一个计时器来确保每小时传递一次方法。

或者它是一项外部任务?就像例行清理日志文件一样。

  • 预定任务。 Windows服务每小时60分钟就有59分钟,所以说,因为它会阻止内存。

答案 1 :(得分:0)

取决于“每小时”的含义。如果每个小时都是准确的时间(下午4点,下午5点),我会查看计划的任务。请记住,计划任务将受服务器上的优先级规则控制。这意味着,如果服务器必须执行具有更高优先级的任务,则您计划的任务可能无法在您希望的时间内完全触发。我想到的唯一问题是,这可能是与当前进程(另一个单独的应用程序运行)断开连接的进程。

根据我的经验,Thread.Sleep()比Timers更可靠。让一个Thread停下来并在一个确切的时间启动它并不是一件容易的事情。

在我的情况下,我们有一个Windows服务,其中线程将睡眠X分钟然后检查数据库以查明是否该做某事。这是一整天运行任务的非常稳定的方式。为简单起见,我们在开始时使用了计划任务,但多次遇到服务优先级问题。这就是我们最终采用Thread.Sleep()方法的原因。

如果任务是一个长时间运行的任务并且可能跨越整个小时,那么您正在查看多线程服务,该服务为多个任务提供单点故障。我会从预定的任务开始,直到它证明它无法完成这项工作。