Principale utente con più risposte
Report asincrono

Domanda
-
Ciao a tutti,
ho un report in un progetto asp.net che mi manda in timeout la pagina perchè deve elaborare una grossa quantità di dati.
Per risolvere il problema vorrei lanciarlo in modalità asincrona. Come posso farlo senza esporlo in un servizio WCF?
grazie!
Risposte
-
-
CIao Pengo, io se fossi in te schedulerei il lavoro in un background worker - ad esempio un processo Windows Service - e spedirei il report subito dopo che questo è completato.
Se più utenti ti chiedono report asincroni andresti a intasare ASP.NET, soprattutto se questa esecuzione va ad usare molte risorse. Con un worker in background su un servizio (usando una tabella tipo "coda" di eleborazione), il problema non si pone.
HTH,
Ciao
Adriano- Contrassegnato come risposta Pengo11 venerdì 15 luglio 2011 09:36
-
Condivido la soluzione di Adriano, nel caso tuo caso se utilizzi solo la response il thread di ASP.net ti va sicuramente in timeout per le elaborazioni molto lunghe.
Un'altra soluzione potrebbe essere, nel caso in cui i dati siano "stabili", creare una tabella dove generare/inserire periodicamente i dati del report per poi eseguire solo una semplice select su questa tabella: una sorta di datawarehouse.
Ciao
Luca Congiu (congiuluc)- Contrassegnato come risposta Pengo11 venerdì 15 luglio 2011 09:36
Tutte le risposte
-
-
Potresti utilizzare la classe PageAsyncTask:
http://msdn.microsoft.com/it-it/library/system.web.ui.pageasynctask.aspx
Prova a dare uno sguardo anche a questo articolo:
http://msdn.microsoft.com/en-us/magazine/cc163725.aspxCiao
Luca Congiu (congiuluc) -
Grazie per l'aiuto,
ho provato l'esempio, ma mi aspetto che il debugger concluda l'evento del mio pulsante e poi arrivi il ritorno del metodo asincrono. Invece esce dal click dopo aver completato OnEnd. In questo modo mi aspetto ancora un timeout della pagina aspx o sbaglio?
In pratica la mia pagina aspx lancia un report direttamente aprendo Excel, usando il "solito" Response.ContentType = "application/vnd.ms-excel"; e non fa nessun altra operazione da lanciare in contemporanea. Quello che servirebbe a me è che la pagina venga rilasciata così che l'utente possa spostarsi in altre pagine e poi si apra il mio report.
- Modificato Pengo11 giovedì 14 luglio 2011 13:11
-
Hai una stima di quanto possa durare il processo?
in ogni caso prova a guardare qui:
https://glucolo.wordpress.com/2011/06/20/long-running-task-with-asp-net/Ciao
Luca Congiu (congiuluc)- Proposto come risposta Glauco Cucchiar venerdì 15 luglio 2011 10:08
-
Ciao,
ho provato il tuo esempio ed è molto valido. Ha però un limite che per me è insuperabile. io lancio il mio report usando l'oggetto Response (Response.ContentType = "application/vnd.ms-excel";) ma vedo che in un Thread separato tale oggetto non è valido ed ho subito un errore.
Thread mioTheread = new Thread(() =>
{
........
Response.Flush(); //ERRORE
Response.Close();
});mioTheread.Start();
Hai una soluzione.
Ancora grazie
-
-
-
CIao Pengo, io se fossi in te schedulerei il lavoro in un background worker - ad esempio un processo Windows Service - e spedirei il report subito dopo che questo è completato.
Se più utenti ti chiedono report asincroni andresti a intasare ASP.NET, soprattutto se questa esecuzione va ad usare molte risorse. Con un worker in background su un servizio (usando una tabella tipo "coda" di eleborazione), il problema non si pone.
HTH,
Ciao
Adriano- Contrassegnato come risposta Pengo11 venerdì 15 luglio 2011 09:36
-
Condivido la soluzione di Adriano, nel caso tuo caso se utilizzi solo la response il thread di ASP.net ti va sicuramente in timeout per le elaborazioni molto lunghe.
Un'altra soluzione potrebbe essere, nel caso in cui i dati siano "stabili", creare una tabella dove generare/inserire periodicamente i dati del report per poi eseguire solo una semplice select su questa tabella: una sorta di datawarehouse.
Ciao
Luca Congiu (congiuluc)- Contrassegnato come risposta Pengo11 venerdì 15 luglio 2011 09:36
-
Ciao, non ho capito benissimo quello che vorresti fare, ma credo sia un po' particolare.
Se non ho capito male vuoi lanciare la creazione del report ma lasciando l'utente completamente libero di continuare a navigare sul sito. Bè, forse chiedi un po troppo da un'applicazione web.
facendo riferimento al mio articolo che ha citato Luca (grazie, sono onorato),
sarebbe fattibile se il "polling" per controllare l'andamento del thread in background fosse attivo in tutto il sito. Dipende da come è strutturato.Domandina: tu crei una "Datatable" e poi la butti nel response come file excel?
potresti generare la tabella come risultato del thread, e l'evento che cattura la fine del worker in background lancia ad esempio in una nuova finestra un handler che ti crea il report, oppure ti avverte in qualche modo che il report e pronto e ti mette a disposizione il link per vederlo.Se mi dici come vorresti l'interazione con l'utente possiamo trovare una soluzione, ma secondo me la più facile e far girare il worker in background dentro una nuova finestra.
Ciao
Programamtore ASP.NET
http://glucolo.wordpress.com -
Ciao, vorrei fare una precisazione:
non solo l'articolo citato è abbastanza datato (2004, quindi ci sono altre metodologie e altre classi utilizzabili), ma l'esempio proposto non è valido per pagine ASP.NET, poiché comunque il thread finale che fa il rendering della pagina, viene eseguito SOLO al termine di tutti gli altri Thread asincroni.
Programamtore ASP.NET
http://glucolo.wordpress.com