2009-04-09 3 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 преждевременно очистит некоторые из элементов Normal priority - я думаю, что это приведет к тому, что DoServiceActions будет выполняться чаще, чем ожидалось. Любые идеи о том, насколько вероятно это/работает вокруг? – David

+0

Я не сталкивался с этой проблемой, но это звучит как правдоподобный сценарий. Я предполагаю, что проверка того, как недавно был вызван метод с использованием секундомера, может быть обходным путем? –

0

Somone здесь сделал это, создавая темы в global.asax. Похоже, что они добились успеха. Я никогда не тестировал этот подход сам.

Это, на мой взгляд, было бы лучшим вариантом, чем перегрузка механизма истечения срока действия кеша.

0

Вы можете использовать ATrigger сервис планирования на без проблем. A .Net library также доступен для создания запланированных задач без накладных расходов.

Отказ от ответственности: Я был среди команды Атриггера. Это бесплатная программа, и у меня нет коммерческой цели.