C# ASP.net global.asax计时器随机停止工作
鉴于代码:C# ASP.net global.asax计时器随机停止工作,c#,asp.net,timer,global-asax,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
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
)
我明白,正是出于这个原因,以这种方式使用计时器并不是一种推荐的解决关键问题的方法,但我无法解释为什么它只是默默地、显然是随机地放弃了。从您的代码中,我希望垃圾收集器能够收集您的计时器,因为它没有句柄。是吗你试过类似的东西
static Timer testTimer ;
protected void Application_Start(object sender, EventArgs e)
{
testTimer = new Timer(...);
}
由于AppDomains的卸载方式、线程模型和许多其他因素,ASP.NET不适合运行计时器
我建议您阅读Scott Hanselman的文章,其中讨论了在ASP.NET web应用程序中成功运行基于计时器的代码的各种方法。谢谢,正是这样!ASP.NET对于运行计时器来说是“好”的,因为它知道它们会随着AppDomain一起消亡(由于“任何数量的”原因,都可以循环使用);即计时器适用于管理AppDomain生存期工作,控制适当的生存期(以及恢复/重叠情况)独立于计时器。OP已经声明了这一点,并明确使用了“AlwaysRunning”。