2009-04-09 59 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非常漂亮的,在此之前,似乎更適合這樣做這類與會話開始和普通頁面加載的東西。你總是發現它是可靠的? – 2009-04-09 10:44:16

0

這裏的Somone是通過在global.asax中創建線程來做到這一點的。聽起來像是他們取得了成功。我從未測試過這種方法。

這在我看來是一個更好的選擇,然後重載緩存過期機制。

0

您可以在共享主機上使用ATrigger調度服務,沒有任何問題。 A .Net library也可用於創建計劃任務,無需開銷。

聲明:我是ATrigger團隊中的一員。這是一個免費軟件,我沒有任何商業目的。