2017-01-11 29 views
0

给予代码:ASP.net 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错误日志中有一些条目:

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

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

该网站处于活动状态(应用程序池的启动模式是AlwaysRunning

据我了解,以这种方式使用的定时器是不是正是这种原因,关键的东西推荐的方法,但我没有拿出一个解释,为什么它默默无闻地显然是随机放弃的。

回答

1

从你的代码中,我期望垃圾收集器收集你的计时器,因为没有处理这个。像

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

谢谢,就是这样! –

0

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

我建议你从斯科特Hanselman的,讨论各种方式成功地运行在ASP.NET Web应用程序基于定时器的代码读取this blog post