ASP.net global.asax定时器随机停止工作

时间:2017-01-11 17:04:58

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

鉴于代码:

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

据我所知,以这种方式使用计时器并不是推荐用于关键事情的方法,正是出于这个原因,但我没有想出为什么它会默默地显然随意放弃。

2 个答案:

答案 0 :(得分:2)

从你的代码中,我希望垃圾收集器收集你的计时器,因为没有句柄。你试过像

这样的东西吗?
static Timer testTimer ;
protected void Application_Start(object sender, EventArgs e)
{
     testTimer = new Timer(...);
}

答案 1 :(得分:-1)

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

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