5

背景: 我有一个在 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 服务)

参考:

ASP.NET 站点 - 在特定时间触发一些代码

网站上的计时器以每小时激活一次 Web 服务调用

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>

4

3 回答 3

4

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

于 2012-10-25T14:25:19.243 回答
2

如果由于某种原因,您必须这样做。请务必阅读IRegisteredObject 以及 Haacked 关于此主题的帖子

于 2014-07-20T06:50:26.980 回答
0

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

于 2012-10-25T14:49:38.153 回答