2009-04-09 7 views

答えて

10

は、ここで私はスケジュールされたタスクトリガーするためにキャッシュの有効期限を使用して、過去にこの種のものを行うために使用しましたGlobal.ascx.csファイルです:現時点では

public class Global : HttpApplication 
{ 
    private const string CACHE_ENTRY_KEY = "ServiceMimicCacheEntry"; 
    private const string CACHE_KEY = "ServiceMimicCache"; 

    private void Application_Start(object sender, EventArgs e) 
    { 
     Application[CACHE_KEY] = HttpContext.Current.Cache; 
     RegisterCacheEntry(); 
    } 

    private void RegisterCacheEntry() 
    { 
     Cache cache = (Cache)Application[CACHE_KEY]; 
     if (cache[CACHE_ENTRY_KEY] != null) return; 
     cache.Add(CACHE_ENTRY_KEY, CACHE_ENTRY_KEY, null, 
        DateTime.MaxValue, TimeSpan.FromSeconds(120), CacheItemPriority.Normal, 
        new CacheItemRemovedCallback(CacheItemRemoved)); 
    } 

    private void SpawnServiceActions() 
    { 
     ThreadStart threadStart = new ThreadStart(DoServiceActions); 
     Thread thread = new Thread(threadStart); 
     thread.Start(); 
    } 

    private void DoServiceActions() 
    { 
     // do your scheduled stuff 
    } 

    private void CacheItemRemoved(string key, object value, CacheItemRemovedReason reason) 
    { 
     SpawnServiceActions(); 
     RegisterCacheEntry(); 
    } 
} 

を、これはあなたをオフに発射しますアクションは2分ごとに実行されますが、これはコード内で設定可能です。

+0

+1このセッションを開始して共通のページが読み込まれているようなことは、この種の作業がはるかに適しているようです。あなたはいつもそれが信頼できると感じましたか? –

+0

質問:アプリケーションがキャッシュをいっぱいにして(サーバーのメモリが不足しているため)、ASP.NETが通常の優先項目の一部を早期にクリアするとどうなりますか。DoServiceActionsがより頻繁に実行され、予期されるようになります。どのようにこれは/回避策の可能性についての任意のアイデアですか? – David

+0

私はこの問題にぶつかりませんでしたが、それはもっともらしいシナリオのようです。私はストップウォッチを使用してメソッドが最近どのくらい呼び出されたかのチェックが回避策になると思いますか? –

0

ここでは、global.asaxでスレッドを作成することでこれをやっていました。彼らはそれで成功したように聞こえた。私はこのアプローチを自分でテストしたことがありません。

これは私の意見では、キャッシュの有効期限のメカニズムがオーバーロードされている方が良い方法でしょう。

0

スケジューリングサービスは共有ホスティングで問題なく使用できます.Net libraryは、オーバーヘッドなしでスケジュールされたタスクを作成するためにも利用できます。

免責事項:私はATriggerチームの一員でした。それはフリーウェアであり、商業目的はありません。

関連する問題