2012-11-30 7 views
5

Ad esempio, desidero chiamare una funzione in intervalli di tempo specifici (attività orarie o giornaliere.)Attività ripetitive in intervalli di tempo specifici?

Sto già utilizzando il timer. Ma funziona fino a quando il mio server locale funziona. Per esempio:

public static void StartYahooWeatherManager() 
{ 
    Timer t = new Timer(1000 * 60 * 60 * 6 /* 6 hours */); 
    t.Elapsed += new ElapsedEventHandler(WriteYahoWeatherRssItemToDb); 
    t.Start(); 
} 

private static void WriteYahoWeatherRssItemToDb(object o, ElapsedEventArgs e) 
{ 
    YahooWeatherManager.InsertYahooWeatherRssItem(YahooWeatherManager.GetYahooWeatherRssItem()); 
} 

Scrivo le informazioni meteo a db, in intervalli di 6 ore. Il progetto è già in Host. L'evento timer funziona fino a quando il server locale del computer è in esecuzione.

Domanda:

Qual è il male del mio codice? (O logico sbagliato usare il timer in WebProject?) Perché il timer funziona solo mentre il server locale funziona?

Qual è il modo migliore per gestire le attività dell'intervallo di tempo? (non serve asp.net)

Spero, posso spiegare il problema. Grazie.

+0

Avete davvero bisogno di farlo in un'applicazione ASP.NET? Hai pensato di creare un servizio di Windows? –

+0

@RuiJarimba, non ce n'è bisogno, ho chiesto anche a me. 'Qual è il modo migliore per gestire le attività dell'intervallo di tempo?'. Scusa, ho aggiornato la domanda. –

risposta

7

Il motivo per cui il timer si ferma è perché questo timer viene eseguito in un'applicazione ASP.NET che a sua volta è ospitato su un server web. Quando questo server arresta o ricicla l'applicazione, AppDomain viene disattivato insieme a tutti i thread che potrebbero essere stati avviati. Ecco perché è una pessima idea scrivere compiti in background ripetuti in un'applicazione ASP.NET. Phil Haack blogged about the dangers.

Il modo corretto per eseguire questa operazione è di ospitare questo codice in un processo separato all'esterno dell'applicazione ASP.NET. Questo potrebbe essere un servizio di Windows o un'applicazione di console che è pianificata per essere eseguita a intervalli regolari utilizzando ad esempio lo scheduler di Windows. In questo modo è garantito che il codice funzioni sempre.

2

Il mio suggerimento è quello di creare un servizio Windows che utilizza un timer, o creare un'applicazione normale e creare un'attività pianificata per eseguirlo nell'intervallo necessario. Questo post StackOverflow può aiutare a:

Windows service and timer

+0

+1. Molte grazie... –

0

È possibile disabilitare il riciclo per il pool di applicazioni a cui appartiene l'app asp.net. Le perdite di memoria sono rare per .Net, quindi è possibile fare affidamento su GC la maggior parte del tempo. Questo rimuoverà anche il riscaldamento dopo il riciclaggio e migliorerà l'esperienza dell'utente con quasi nessuno sforzo.

L'altra buona soluzione è creare un'applicazione console e programmarla in windows "Task Scheduler". Avrai il bel UI per gestire quando e come eseguire. È molto più facile mantenere tali compiti di "Windows Service" e richiede di scrivere meno codice.