【问题标题】:ASP.net global.asax Timers randomly stop workingASP.net global.asax 定时器随机停止工作
【发布时间】:2017-01-11 17:04:58
【问题描述】:

给定代码:

protected void Application_Start(object sender, EventArgs e)
{
    var testTimer = new Timer(
        LogTimer,
        null,
        new TimeSpan(0, 0, 0, 0),
        new TimeSpan(0, 0, 0, 1)
    );
}

public static void LogTimer(object sender)
{
    "Hello".Log();
}

在看似随机的情况下,计时器停止触发,除非我重新启动网站,否则不会再次启动。

它不会抛出任何异常,但是查看 Windows 错误日志有一些条目:

  • DLL“C:\Windows\System32\Secur32.dll”中服务“Lsa”的打开过程失败。此服务的性能数据将不可用。数据部分的前四个字节 (DWORD) 包含错误代码。

  • 无法打开服务器服务性能对象。数据部分的前四个字节 (DWORD) 包含状态代码。

站点处于活动状态(应用池的启动模式为AlwaysRunning

我知道,出于这个原因,不推荐以这种方式使用计时器来处理关键问题,但我无法解释为什么它会默默地并且显然是随机地放弃。

【问题讨论】:

    标签: c# asp.net timer global-asax


    【解决方案1】:

    从您的代码中,我希望垃圾收集器能够收集您的计时器,因为它没有句柄。你有没有尝试过类似的东西

    static Timer testTimer ;
    protected void Application_Start(object sender, EventArgs e)
    {
         testTimer = new Timer(...);
    }
    

    【讨论】:

    • 谢谢,就是这样!
    【解决方案2】:

    由于 AppDomain 的卸载方式、线程模型和许多其他因素,ASP.NET 不适合运行计时器。

    我建议您阅读 Scott Hanselman 的 this blog post,其中讨论了在 ASP.NET Web 应用程序中成功运行基于计时器的代码的各种方法。

    【讨论】:

    • ASP.NET 对于运行计时器来说“很好”,了解它们会随着 AppDomain 消亡(可以出于“任意数量”的原因进行回收); IE。 timers 适合管理 AppDomain-lifetime 工作,控制一个合适的生命周期(和恢复/重叠情况)独立于 timers。 OP 已经声明了这一知识,并明确使用“AlwaysRunning”。
    猜你喜欢
    • 2014-04-11
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2015-07-10
    相关资源
    最近更新 更多