Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net global.asax计时器随机停止工作_C#_Asp.net_Timer_Global Asax - Fatal编程技术网

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”。