66 messaggi dal 11 maggio 2006
Buongiorno a tutti,

Avendo la necessità di gestire alcune procedure ad intervalli di tempo regolari, ho implementato all'interno della chiamata Application_Start, nel file Global.asax una funzione atta alla creazione di diversi processi ciascuno con un Thread separato.

Ciascuno di questi processi ad ogni ciclo di esecuzione aggiorna una tabella del database SQL, pertanto in ogni momento è possibile sapere quando è avvenuta l'ultima esecuzione di un dato processo, se l'esecuzione del processo ha riportato errori, quale sarà la prossima esecuzione del processo. Ciascuno dei processi implementa inoltre una gestione degli errori.

A volte, per ragioni a me sconosciute e malgrado la gestione degli errori, capita che i processi si fermino.

Pertanto, stavo pensando di implementare una sorta di processo supervisore che monitorasse l'andamento degli altri processi, ed in questo caso vorrei sfruttare nello stesso file Global.asax la funzione Session_Start; in maniera tale da fare sì che all'inizio di ogni sessione venga eseguito un controllo sullo stato di esecuzione del processo supervisore

Qui mi sono fermato, in quanto non mi sembra una soluzione particolarmente efficiente ed inoltre a quanto pare sembrerebbe impossibile il controllo di un processo se non dall'interno del processo stesso.

Spero di essere stato chiaro nella spiegazione del problema, e da qui le domande:
1) esistono soluzioni più eleganti ed efficienti per la creazione di un processo "WatchDog"
2) una volta lanciato un processo mediante l'inizializzazione di un nuovo Thread è possibile verificarne lo stato o killarlo?
Modificato da hiram il 02 ottobre 2013 15.26 -
103 messaggi dal 04 ottobre 2010
Se l'applicazione gira sotto IIS, potrebbe essere un problema di recycling: non vedendo richieste IIS considera il sito web inattivo e quindi, termina l'esecuzione del sito web che riprende alla prossima richiesta, ma intanto, l'arresto del sito provoca l'arresto anche del ciclo di esecuzione di questi processi. Prova a togliere il recycling e controlla se si ripresenta questa problematica, l'impostazione potrai trovarla nella gestione del suo application pool.
Modificato da Biohazard il 02 ottobre 2013 16.24 -
66 messaggi dal 11 maggio 2006
Grazie della risposta!

Di defualt IIS6 recicla ogni 29 ore, ma dopo il riciclo dovrebbe rieseguire Application_Start no???

Ho provato con un riciclo manuale da IIS ed i thread sono tutti ripartiti, per cui perchè pensi dipenda da questo?

Che tu sappia esiste un modo per verificare lo stato di un thread?
(ad esempio un id restituito al momento della creazione)

Avevo pensato anche ad un servizio esterno che tramite una chiamata ad un webservice ogni minuto facesse le veci di un timer INDIPENDENTE.

Ma rimarrebbe il problema della verifica dello stato dei thread esistenti, che eventualmente potrei superare con un analisi di un log, sul quale scrivo l'ora di esecuzione di ciascun processo...

Ho inoltre letto l'articolo seguente:
http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

Come mi consigli di procedere?
Modificato da hiram il 02 ottobre 2013 23.55 -
103 messaggi dal 04 ottobre 2010
- Application_Start() è chiamato quando IIS carica l'applicazione, non quando la ricicla, quindi può essere la causa del tuo disservizio.
Questo, almeno è ciò che mi riconferma anche stackoverflow:
http://stackoverflow.com/questions/12027471/does-recycle-call-application-start
Il fatto che i processi siano ripartiti non è dato dal reciclo, ma dal fatto che tu dopo il reciclo hai fatto una richiesta (dato che l'applicazione è stata richiamata, avviamola nuovamente). Però non hai garanzie che dopo un riciclo, avrai subito una richiesta.

- Se lavori con la classe Thread, la classe mette a disposizione sia la proprietà IsAlive, che ti dice se è ancora in esecuzione o meno, che la proprietà ThreadState valorizzata con un enum flaggable, quindi con la possibilità di confrontare tali stati usando and oppure or bit a bit:
http://msdn.microsoft.com/it-it/library/system.threading.threadstate.aspx

- Per sapere l'id del Thread corrente, hai la proprietà ManagedThreadId
http://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid%28v=vs.90%29.aspx

Se il punto 1, ovvero sempre il riciclo, è la causa del tuo problema, allora il mio consiglio rimane sempre quello di disabilitare il riciclo. Se la cosa non si risolve, allora ti consiglio di spostare tutto questa gestione dei thread in un altro tipo di progetto che non sia un applicativo web ma un progetto orientato ai servizi, (se vai con la express, la versione di visual studio web developer non prevede questo tipo di progetto, devi scaricarti visual c# express se non sbaglio e potrai creare un progetto di tipo "servizio windows")

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.