背景: 我有一个在 Windows Server 2008 上运行的 .NET 4.0 Web 服务,用 C# 编写。我想在每天运行一次代码的 asp.net Web 服务中运行一个计时器。我听说过一些限制(见下文),但我想知道我的计划是否可行,以便绕过一些限制并将代码保留在 Web 服务中,因为它不是关键任务代码。然而,崩溃是不可接受的。注意:我不是也不能使用 WCF。
计划:
- 在我的 Web 服务的构造函数中声明并实例化
System.Threading.Timer
(就在注释掉的行旁边:)//InitializeComponent();
。 - 每 30 分钟触发一次计时器。
- 注意:因为我正在使用
System.Threading.Timer
我不应该根据下面的 msdn Tip #6 运行保持活动代码。 - 如果当前时间在我的数据库值(运行代码所需的时间)的 30 分钟内,则运行代码。
问题:
- 我想知道
System.Threading.Timer
使用上面的计划在 asp.net c# 代码中使用它有多可靠,如果它可以正确运行,让我们说超过 97% 的时间? - 当应用程序池被回收和 IIS 服务器重新启动时,此计划是否有效?
在 Web 服务中使用计时器似乎存在以下问题:
- 应用程序池回收
- 线程死亡
- 长时间没有人上网
- 时间记忆问题(最好使用 Windows 服务)
参考:
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 应用程序的传入请求的情况下执行,这是后台处理的理想情况。您也可以在此后台进程中进行索引或发送电子邮件等工作。”</p>