Qual è la procedura migliore per avviare il processo di manutenzione su ASP.NET [chiuso]

StackOverflow https://stackoverflow.com/questions/45841

  •  09-06-2019
  •  | 
  •  

Domanda

Data un'applicazione ASP.NET, devo eseguire un processo di manutenzione su base regolare (giornaliera, oraria, ecc.).

Qual è il modo migliore per ottenere ciò senza fare affidamento su un processo esterno come un'attività pianificata sul server (supponiamo che non abbia accesso al server - ambiente di hosting condiviso).

È stato utile?

Soluzione

Ecco come lo fa 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));
}

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

Altri suggerimenti

Un modo per farlo, se non hai bisogno di farlo in un orario programmato, ma hai solo bisogno di ripulire "una volta ogni tanto", è creare una funzione nel tuo Global.asax Session_OnEnd() che creerà un ordine casuale numero compreso tra 1 e 100 e se il numero è, ad esempio, 50, esegui l'attività di manutenzione.

Ovviamente puoi ridurre il "100" per far sì che l'attività si svolga più frequentemente.

Inoltre è presente un articolo intitolato "Simula un servizio Windows utilizzando ASP.NET per eseguire processi pianificati" all'indirizzo http://www.codeproject.com/aspnet/ASPNETService.asp che utilizza una cache in scadenza per simulare un timer.Afferma che può essere eseguito su qualsiasi sito ospitato.

Se stai utilizzando l'ultimo, leggi questo commento da un post su questa tecnica:

Devi davvero fare attenzione alla lunghezza dell'attività in esecuzione.Ogni nuovo compito è un nuovo thread di lavoratore e c'è un numero limitato di quelli, poiché "prende in prestito" un thread dal pool di thread gestito.

A partire da V3.5 del framework, il numero massimo di thread è stato aumentato di 10 volte da 25 a 250.Ma ora c'è una startup logaritmica per loro, quindi mentre distribuisce più thread, diventa più pungente con loro.Se si esaurisce i thread disponibili nel pool di thread gestiti, i tempi di risposta passano attraverso il tetto.

Quello che stai davvero scrivendo qui è un sistema di messaggistica/accodamento.

Se stai facendo cose come l'aggiornamento della cache, allora in ogni caso, inizia un nuovo compito.Se stai facendo qualcosa come scaricare una risorsa HTTP secondaria o una sorta di lavoro di database intensivo: scrivi un servizio Windows e usa una coda che ti consente di più controllo su quanto "mordi" ogni volta.

Sebbene la soluzione Cache funzioni per casi semplici, se le tue esigenze di pianificazione cambiano, sarai sfortunato.Invece, potresti usare Quarzo.NET, un port del popolare framework Java Quarzo, che è molto flessibile.

Anche se il modo in cui StackOverflow lo fa è decisamente unico, potresti voler monitorarlo domanda inoltre, poiché si riferisce.

questo è un processo esterno e non so quanto sia affidabile, ma potresti impostare qualcosa di simile su una macchina che sai che è sempre accesa www.webcron.org.

Fondamentalmente ciò che fa è raggiungere una pagina a cui lo richiedi secondo la pianificazione richiesta.

In sostanza, potresti avere qualsiasi cosa che colpisca una pagina con una pianificazione regolare per avviare la tua attività di manutenzione.

Jeff e Joel hanno anche discusso di come fare cose simili in un recente podcast utilizzando altri metodi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top