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 分)、次のエラーが表示されます。

「タイプ 'System.StackOverflowException' の未処理の例外が mscorlib.dll で発生しました」

このエラーは、無限ループの作成方法に関連している可能性がありますか?

はいの場合、これを達成するためのより良い方法はありますか、修正できますか、またはこのコードは問題ありませんか?

4

3 に答える 3

5

II を悪用するのではなく、そのようなことのために Windows サービスを作成することを検討してください。

どこかはわかりませんが、IIs は javas サーバーのように長寿命のサービスを作成するのには適していないことを読みました。

于 2012-12-09T11:39:23.300 に答える
5

「CheckStatus」を再帰的に呼び出しています。したがって、8 秒ごとにコール スタックにエントリが 1 つ追加されます。

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 に答える