1

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

这个错误是否与我如何制作无限循环有关?

如果是,是否有更好的方法来实现这一点,我可以修复它,或者这段代码可以吗?

4

3 回答 3

5

考虑为这样的事情创建一个 Windows 服务,而不是滥用 II..

我不知道在哪里,但我读到 IIs 不适合创建像 javas 服务器那样的长期服务。

于 2012-12-09T11:39:23.300 回答
5

您正在递归调用“CheckStatus”。因此,每 8 秒,您的调用堆栈上就会多出一个条目:

CheckStatus()-> CheckStatus()-> CheckStatus()-> 等等……直到你得到一个 StackOverflowException。

相反,您应该使用

while (true)
{
    /* Your Code */
    Thread.Sleep(8000);
}

另请注意,默认情况下,如果 15 分钟内没有请求,IIS 将卸载您的应用程序,从而导致您的线程被终止。

于 2012-12-09T11:42:17.970 回答
0

我还建议为此创建一个 Windows 服务,比如守护进程。您可以创建一个服务,它只会定期对您的应用程序调用一个特殊操作。其余的工作将在您的 MVC 应用程序中完成。看看这篇文章的例子。

于 2012-12-09T14:46:41.293 回答