鉴于代码:
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
。
据我所知,以这种方式使用计时器并不是推荐用于关键事情的方法,正是出于这个原因,但我没有想出为什么它会默默地显然随意放弃。
答案 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应用程序中成功运行基于计时器的代码的各种方法。