2012-12-09 34 views
1

我需要一個操作至極需要運行每x secconds永遠,以及實現這一目標,我沒有:製作一個無限循環中。淨MVC

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'的未處理的異常」

這個錯誤可能與我如何使我的無限循環有關嗎?

如果是,是否有更好的方法來實現這個目標,我可以修復它,還是這個代碼好嗎?

回答

5

您正在遞歸調用「CheckStatus」。因此,每8秒就會有你的調用堆棧中一個條目:

CheckStatus() - >CheckStatus() - >CheckStatus() - >等..直到你得到一個StackOverflowException。

相反,你應該使用

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

也請注意,在默認情況下IIS將卸載應用程序,如果有在15分鐘內沒有任何要求,導致你的線程被殺害。

+0

啊哈,完美!謝謝! – BjarkeCK

5

考慮這樣的事情創建一個Windows服務,而不是濫用非法入境..

我不知道在哪裏,但我讀了IIS是不適合像Java類服務器建立長期生活服務。

+0

我會希望最好的。感謝您的警告。 – BjarkeCK

0

我也建議爲它創建一個Windows服務,就像一個守護進程。您可以創建一個服務,定期在應用程序上調用一個特殊的操作。其餘的工作將在您的MVC應用程序中完成。例如,看看at this post

+0

爲什麼?這種方法有什麼不好? – BjarkeCK

+0

這是我已經使用和測試過的一個替代方案。無論您選擇哪種實現方式,都需要通過讓方法在每次調用時向文件或數據庫寫入時間戳來測試它,然後讓應用程序長時間運行而無需任何請求。 – Panos

+0

啊,好吧,我明白了。是的,如果網站上沒有任何活動,腳本將在15分鐘左右後停止。但這很好,只要再次開始活動時就會再次啓動。它確實如此。 – BjarkeCK