在.Net MVC中进行无限循环

时间:2012-12-09 11:35:29

标签: c# asp.net-mvc asp.net-mvc-4 backgroundworker task

我需要一个需要每隔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'类型的未处理异常”

这个错误可能与我如何制作无限循环有关吗?

如果是,是否有更好的方法来实现这一目标,我能解决它,还是这段代码还好?

3 个答案:

答案 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的例子。