我应该使用Windows服务还是ASP.NET后台线程?

时间:2009-06-13 16:35:03

标签: asp.net windows-services

我正在ASP.NET 3.5中编写一个Web应用程序来处理一些基本的数据输入方案。应用程序还有一个组件需要不断轮询某些数据并根据业务逻辑执行操作。

实施“轮询”组件的最佳方法是什么?它需要每隔几分钟运行并检查一次数据。

过去我见过几种不同的选择:

  1. Web应用程序启动后台线程,该后台线程将始终在Web应用程序运行时运行。 (我看到的实现在Application_Start事件中启动了线程。)
  2. 创建一个始终在运行的Windows服务
  3. 这两种选择有哪些好处?还有其他选择吗?

    我倾向于Windows服务,因为它是分开的,可以在不同的服务器上运行(更具可伸缩性),并且可以更好地控制何时启动/停止等等。但是,我觉得它的紧凑性在Web应用程序的过程中运行“后台”逻辑可能会使整个解决方案更容易理解。

4 个答案:

答案 0 :(得分:6)

我主要针对您提供的原因选择单独的Windows服务:

  • 如有必要,您可以在其他服务器上运行它。
  • 您可以独立于网站启动和停止它。

我还要补充一点,它可能会对网站本身的性能产生一些影响 - 这是你想要避免的。

这里的嗡嗡声是“关注点分离”。该网站关注的是向用户呈现数据,该服务检查数据的完整性。

如果需要,您还可以相互独立地更新网站和服务。

我打算建议您查看计划任务,让Windows控制进程运行时,但我重新阅读您的问题并注意到您希望检查每隔几分钟运行一次。在这种情况下,启动进程的开销可能太大了 - 尽管一些实验可能会证明这种方式或其他方式。

如果您使用预定任务,您可能还可以在当前任务完成之前开始下一次检查 - 如果您完全可以控制,可以编写代码。

答案 1 :(得分:2)

为什么不使用没有ui的控制台应用?可以做所有Windows服务,并且更容易调试和维护。除非绝对必要,否则我不会做Windows服务。

答案 2 :(得分:1)

您可能会发现SQL Server作业调度程序足以满足您的需要。

答案 3 :(得分:0)

在这种情况下,控制台应用程序效果不佳。我写了一个TAPI应用程序,它必须留在后台并拦截来电。但它只做了一次因为tapi经理得到了GCed而且从来没有用于第二次来电。