我需要一个需要每隔x秒永久运行的操作,并且实现这一点:
protected void Application_Start()
{
InitialieOnce.Initialize();
}
public static class InitialieOnce
{
private static bool initialized = false;
public static void Initialize()
{
if (initialized == false)
{
initialized = true;
Thread t = new Thread(x => CheckStatus());
t.IsBackground = true;
t.Start();
}
}
private static void CheckStatus()
{
//My script goes here.
Thread.Sleep(8000);
CheckStatus();
}
}
一段时间后(约5分钟)我收到此错误: “mscorlib.dll中发生了'System.StackOverflowException'类型的未处理异常”
这个错误可能与我如何制作无限循环有关吗?
如果是,是否有更好的方法来实现这一目标,我能解决它,还是这段代码还好?
答案 0 :(得分:5)
考虑为这样的事情创建Windows服务,而不是滥用II ..
我不知道在哪里,但我读到IIs不适合创建像javas服务器那样的长期生活服务。
答案 1 :(得分:5)
您正在递归调用“CheckStatus”。因此,每隔8秒,您的调用堆栈中将再有一个条目:
CheckStatus()
- > CheckStatus()
- > CheckStatus()
- >依此类推..直到你得到StackOverflowException。
相反,你应该使用
while (true)
{
/* Your Code */
Thread.Sleep(8000);
}
另请注意,默认情况下,如果15分钟内没有请求,IIS将卸载您的应用程序,导致您的线程被杀死。
答案 2 :(得分:0)
我还建议为此创建一个Windows服务,就像一个守护进程。您可以定期创建一个只在应用程序上调用特殊操作的服务。其余的工作将在您的MVC应用程序中完成。看看at this post的例子。