2008-09-05 9 views
7

ASP.NETアプリケーションでは、メンテナンスプロセスを定期的(毎日、毎時など)に実行する必要があります。ASP.NETのキックオフメンテナンスプロセスのベストプラクティス

サーバー上のスケジュールされたタスクのように外部プロセスに頼ることなく、これを実現するための最良の方法は何(私は、サーバーへのアクセスを持っていないと仮定 - 環境を共有ホスティング)。

+0

この質問は、オススメの回答を集めたベストプラクティスを求めているので、スタックオーバーフローに関するトピックです。 – cybermonkey

答えて

11

ここStackOverflowのは、それをしないという方法です:

private static CacheItemRemovedCallback OnCacheRemove = null; 

protected void Application_Start(object sender, EventArgs e) 
{ 
    AddTask("DoStuff", 60); 
} 

private void AddTask(string name, int seconds) 
{ 
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, seconds, null, 
     DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, 
     CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
{ 
    // do stuff here if it matches our taskname, like WebRequest 
    // re-add our task so it recurs 
    AddTask(k, Convert.ToInt32(v)); 
} 

詳細:http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

+1

Jeff Atwood:2009年2月12日6:50 am いいえ、専用のタスクに切り替えました。私たちは間違いなくこの技法を抜けました。私はそれが小規模なサイトでは大丈夫だと思います! –

2

これを行う方法の1つは、スケジュールされた時間に行う必要はなく、「一度」をクリーンアップするだけで、Global.asax Session_OnEnd()に関数を作成することです1〜100の間の乱数を作成し、50の場合は保守タスクを実行します。

オフコースでは、「100」を減らしてタスクを頻繁に実行することができます。

また、期限切れのキャッシュを使用してタイマーをシミュレートするhttp://www.codeproject.com/aspnet/ASPNETService.aspに「スケジュールされたジョブを実行するためのASP.NETを使用したWindowsサービスのシミュレーション」というタイトルの記事があります。それはそれが任意のホストされたサイトで動くことができると主張する。

あなたが最後のものを使用している場合は、この技術についての記事からこのコメントを読んでください:

あなたが本当に実行中のタスクの 長さに注意する必要があります。すべての新しい タスクは、新しいワーカースレッドであると それらの限られた数があります - として、それは、管理対象 スレッドプールからスレッドを「借用します」。

枠組みのV3.5以降のスレッドの 最大数は は250に25から10倍に増加した。しかし、それはそれはとstingier取得するより多くのスレッド をdolesように対数スタートアップが、それら に今あります ましたそれら。あなたは マネージスレッドプール内の使用可能なスレッドのうち 実行する場合 - あなたの応答を 時間が 屋根を通過しようとしています。あなたが本当にここに書いている何

は メッセージング/キューイング・システムです。

キャッシュを更新する場合は、是非、 新しいタスクをオフにしてください。 Windowsサービスを作成し、 はあなたがするたびにオフ「かむ」どのくらい をより細かく制御することができるというキューを使用する - あなたは二 HTTPリソースまたは 集中的なデータベース作業のいくつかの種類をダウンロードするよう 何かをやっている場合。

0

これは、外部プロセスであり、私がどのように信頼性の高い知りませんが、あなたがマシン上に似た何かを設定することができますが、あなたが知っているのは常にwww.webcron.orgです。

基本的にはそれが何をあなたが要求したスケジュール上にそれを要求するページがヒットです。

メンテナンス作業を開始する定期的なスケジュールで、何かがページに当たる可能性があります。

JeffとJoelも、最近のポッドキャストで他の方法で同様のことを行うことについて議論しました。

1

StackOverflowのやり方は間違いありませんが、questionも関連しているため、これを監視することをおすすめします。

2

シンプルなケースではキャッシュソリューションが機能しますが、スケジューリングの必要性が変わった場合は不運になります。その代わりに、普及しているJavaフレームワークQuartzのポートであるQuartz.NETを使うことができます。これは非常に柔軟です。

関連する問題