【问题标题】:How to use System.Threading.Timer with asp.net web service如何将 System.Threading.Timer 与 asp.net Web 服务一起使用
【发布时间】: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


【解决方案1】:

如果出于某种原因,您必须这样做。请务必阅读IRegisteredObject 以及 Haacked 在 subject 上的帖子

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好的,感谢我在这里和那里阅读过的建议,但无论如何我都打算这样做......我已经启动了一个 Windows 服务项目来正确地做这件事。
      猜你喜欢
      • 2012-05-22
      • 2017-02-05
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      相关资源
      最近更新 更多