2012-11-30 24 views
5

たとえば、特定の時間間隔(毎時または毎日のタスク)で関数を呼び出したいとします。特定の時間間隔で繰り返されるタスク?

私はすでにTimerを使用しています。しかし、私のローカルサーバが動作している限り動作しています。例:

public static void StartYahooWeatherManager() 
{ 
    Timer t = new Timer(1000 * 60 * 60 * 6 /* 6 hours */); 
    t.Elapsed += new ElapsedEventHandler(WriteYahoWeatherRssItemToDb); 
    t.Start(); 
} 

private static void WriteYahoWeatherRssItemToDb(object o, ElapsedEventArgs e) 
{ 
    YahooWeatherManager.InsertYahooWeatherRssItem(YahooWeatherManager.GetYahooWeatherRssItem()); 
} 

気象情報を6時間間隔で書き込みます。プロジェクトはすでにホストにあります。タイマーイベントは、コンピュータのローカルサーバーが動作している限り動作しています。

質問:

私のコードについて間違っては何ですか? (またはWebProjectでタイマーを使用することに論理的に間違っていますか?)タイマーはローカルサーバーが動作している間だけ動作していますか?

時間間隔のタスクを管理する最も良い方法は何ですか? (asp.netは必要ありません)

私は問題を説明することができます。ありがとう。

+0

あなたは本当にASP.NETアプリケーションでそれを行う必要がありますか? Windowsサービスの作成を検討しましたか? –

+0

@RuiJarimba、いいえ、また私はそれも尋ねました。 '時間間隔タスクを管理する最善の方法は何ですか? '申し訳ありませんが、質問を更新しました。 –

答えて

7

タイマが停止した理由です。このサーバーがアプリケーションを停止またはリサイクルすると、AppDomainは起動した可能性のあるすべてのスレッドと共に停止します。だからこそ、ASP.NETアプリケーションで繰り返されるバックグラウンドタスクを書くことは非常に悪い考えです。 Phil Haack blogged about the dangers

これを行う正しい方法は、このコードをASP.NETアプリケーションの外部の別のプロセスでホストすることです。これは、Windowsのスケジューラなどを使用して定期的に実行するようにスケジュールされたWindowsサービスまたはコンソールアプリケーションです。このようにして、コードは常に実行されることが保証されます。

2

私の提案は、タイマーを使用するWindowsサービスを作成するか、通常のアプリケーションを作成し、必要な間隔で実行するスケジュールされたタスクを作成することです。このStackOverflowのポストはあなたを助けることがあります。このタイマーは、それ自体がWebサーバー上でホストされているASP.NETアプリケーションで実行されるため

Windows service and timer

+0

+1。どうもありがとう... –

0

asp.netアプリケーションが属するアプリケーションプールのリサイクルを無効にすることができます。メモリリークは.Netではまれですので、ほとんどの場合GCに頼ることができます。これによりリサイクル後のウォームアップもなくなり、ユーザーの操作性が向上します。

他の良い解決策は、コンソールアプリケーションを作成し、ウィンドウ "Task Scheduler"でスケジュールすることです。実行するタイミングと方法を管理するには、素敵なUIが必要です。このようなタスクを "Windows Service"よりも保守するほうがずっと簡単で、コードを少なく書く必要があります。

関連する問題