如何在asp.net Web服务中使用System.Threading.Timer

时间:2012-10-25 14:22:19

标签: c# asp.net service web timer

背景 我在使用C#编写的Windows Server 2008上运行.NET 4.0 Web服务。 我想在每天运行一次代码的asp.net Web服务中运行一个计时器。我听说过这方面的一些限制(见下文),但我问我计划的是否可以解决一些限制并将代码保留在Web服务中,因为它不是关键任务代码。然而,崩溃是不可接受的。注意:我不是也不能使用WCF。

计划:

  • 在构造函数中声明并实例化System.Threading.Timer 我的网络服务(在注释掉的行旁边: //InitializeComponent();)。
  • 每30分钟点火一次。
  • 注意:因为我使用System.Threading.Timer我不应该跑 保持活动代码根据下面的msdn提示#6。
  • 如果是当前时间 是在我的数据库值的30分钟内(运行代码所需的时间) 然后运行代码。

问题:

  • 我想知道使用上面的计划在asp.net c#代码中使用System.Threading.Timer是多么可靠,如果它能正确运行,那么超过97%的时间会这样说吗?
  • 当应用程序池被回收并重新启动IIS服务器时,此计划是否有效?

在Web服务中使用计时器似乎存在以下问题:

  • app pool recycling
  • 线程死亡
  • 没有人长时间点击网页
  • 时间内存问题(最好使用Windows服务)

参考文献:

ASP.NET Site - Firing some code at a specific time

Timer on Website to activate Web Service calls every hour

http://forums.asp.net/t/1079158.aspx/1

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx(见提示#6)

来自提示#6 “在System.Threading命名空间中找到的Timer类是.NET Framework中一个非常有用但不太知名的类,至少对Web开发人员来说是这样。一旦创建,Timer将以可配置的间隔从ThreadPool调用线程上的指定回调。这意味着您可以设置代码以在没有对ASP.NET应用程序的传入请求的情况下执行,这是后台处理的理想情况。您也可以在此后台进程中执行索引或发送电子邮件等工作。“

3 个答案:

答案 0 :(得分:4)

你正在使用错误的工具来完成工作。 Web服务用于按需使用,而服务和计划任务应用于定期活动。将相关代码从Web服务移出到共享库中,然后创建带有Timer的Windows服务或可通过计划任务安排的控制台应用程序。

答案 1 :(得分:1)

如果由于某种原因,你必须这样做。请务必阅读IRegisteredObject 以及此subject

上的Haacked的帖子

答案 2 :(得分:0)

您可以在Global.asax.cs事件中的Application_Start文件中设置计时器对象,而不是在Web服务中。