1

ASP.MVC アプリケーションをバックグラウンド タスクのスケジューラとして機能させたいと考えています。HttpApplication でサブクラス化されたクラスには、次のコードがあります。

public class MvcApplication : System.Web.HttpApplication
{
    private Timer Timer;
    protected void Application_Start()
    {
        if (Timer == null)
        {
            TimerCallback cb = OnTimerElapsed;
            AutoResetEvent autoEvent = new AutoResetEvent(false);
            Timer = new Timer(cb, autoEvent, INITIAL_DELAY, TIMER_INTERVAL);
        }
    }

    private void OnTimerElapsed(Object stateInfo)
    {
        //perform background task
    }
}

また、System.Threading.Timer を使う代わりに、Quartz 相当のコードにも置き換えていますが、これもしばらくすると発火しなくなります。

Application_Start() は適切な場所ですか、それともより良い場所がありますか?

Timer と Quartz の両方のアプローチが機能します。しかし、Quartz では、1 分間の間隔のように見え、20 間隔 (20 分) 後にトリガーが起動しなくなります。タイマーを使用すると、トリガーが発射を停止する間隔が何回になるかわかりません。

4

2 に答える 2

1

(注:これはこの回答のかなり遅いリリースですが、これにつまずいた人のために、私の2セントは以下です)

20分の理由は、iisアイドルタイムアウトのように聞こえます...デフォルトは20分です。

アプリ プール (詳細設定) のアイドル タイムアウトを 20 から 0 に変更してみてください。この変更により、アプリが起動したままになり、タイマーが実行されます。

于 2014-01-26T21:43:04.393 に答える
0

ASP.Netは、あなたが説明しているような長時間実行または定期実行のプロセスに最適なプラットフォームではありませんが、タイマーが起動を停止する理由は特にわかりません。

ただし、これは、彼のアプローチの概要とほぼ同じことを達成したいと考えている人による投稿です。

http://www.west-wind.com/weblog/posts/2007/May/10/Forcing-an-ASPNET-Application-to-stay-alive

于 2012-03-24T01:23:36.187 に答える