【发布时间】:2012-10-15 18:17:55
【问题描述】:
背景: 我有一个在用 C# 编写的 Windows Server 2008 上运行的 .NET 4.0 Web 服务。 我想在每天运行一次代码的 asp.net Web 服务中运行一个计时器。我听说过一些限制(见下文),但我想知道我的计划是否可行,以便绕过一些限制并将代码保留在 Web 服务中,因为它不是关键任务代码。然而,崩溃是不可接受的。注意:我不是也不能使用 WCF。
计划:
- 在构造函数中声明并实例化
System.Threading.Timer我的网络服务(就在注释掉的行旁边://InitializeComponent();)。 - 每 30 分钟触发一次计时器。
- 注意:因为我使用的是
System.Threading.Timer,所以我不必运行 根据下面的 msdn Tip #6 保持活动代码。 - IF 当前时间 在我的数据库值的 30 分钟内(运行代码所需的时间) 然后运行代码。
问题:
- 我想知道使用上述计划在 asp.net c# 代码中使用
System.Threading.Timer的可靠性如何,如果它能够正确运行,假设超过 97% 的时间? - 当应用程序池被回收和 IIS 服务器重新启动时,此计划是否有效?
在 Web 服务中使用计时器似乎存在以下问题:
- 应用程序池回收
- 线程死亡
- 长时间没有人上网
- 时间记忆问题(最好使用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 应用程序的传入请求的情况下执行,这是后台处理的理想情况。您也可以在此后台进程中进行索引或发送电子邮件等工作。”
【问题讨论】:
-
我会先评论(根据标题)然后然后阅读:拜托,拜托,不要这样做!
-
现在阅读后,我能否请您参考我以前(但不仅是)关于这个主题的答案 - 没关系“但那是不同的”,我所说的内容相同:@987654325 @ 最后,我认为您误解了您认为自己理解的计时器使您的应用程序保持活力的数量。
-
Readers - 此方法曾经/用于更新 SO 上的徽章。诀窍是使用过期缓存时间。请参阅 Jeff Atwood 的这篇旧文章:stackoverflow.blog/2008/07/18/easy-background-tasks-in-aspnet 或 Omar Al Zabir 在代码项目上的另一篇文章:codeproject.com/Articles/12117/…
标签: c# asp.net service web timer