5

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

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

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 時間間隔で db に書き込みます。プロジェクトはすでにホストにあります。コンピューターのローカル サーバーが実行されている限り、タイマー イベントは機能します。

質問:

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

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

問題を説明できることを願っています。ありがとう。

4

3 に答える 3

7

タイマーが停止する理由は、このタイマーが Web サーバーでホストされている ASP.NET アプリケーションで実行されるためです。このサーバーがアプリケーションを停止またはリサイクルすると、AppDomain は、開始した可能性のあるすべてのスレッドと共に停止します。そのため、ASP.NET アプリケーションで繰り返しバックグラウンド タスクを記述することは非常に悪い考えです。フィル・ハークblogged about the dangers

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

于 2012-11-30T15:12:14.133 に答える
2

私の提案は、タイマーを使用する Windows サービスを作成するか、通常のアプリケーションを作成し、必要な間隔で実行するようにスケジュールされたタスクを作成することです。この StackOverflow の投稿が役立つ場合があります。

Windows サービスとタイマー

于 2012-11-30T15:09:28.533 に答える
0

asp.net アプリが属するアプリケーション プールのリサイクルを無効にすることができます。.Net ではメモリ リークが発生することはめったにないため、GCほとんどの場合は信頼できます。これにより、リサイクル後のウォームアップも解消され、ほとんど労力をかけずにユーザー エクスペリエンスが向上します。

もう 1 つの適切な解決策は、コンソール アプリケーションを作成し、Windows " Task Scheduler" でスケジュールすることです。UIいつ、どのように実行するかを管理するのに最適です。このようなタスクを維持するのは " " よりもはるかに簡単でWindows Service、記述するコードも少なくて済みます。

于 2013-12-31T12:09:30.997 に答える