none
Report asincrono RRS feed

  • 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!

    giovedì 14 luglio 2011 07:03

Risposte

  • asp.net supporta i thread e le chiamate async.
    Puoi fare riferimento a questo articolo:
    http://msdn.microsoft.com/en-us/magazine/cc164036.aspx
     
    Ciao
     
     
     

    Se il post ti è tornato utile "suggerisci come risposta"
    Salvatore Di Fazio
    Bitvector
    Rebitting
    Twitter: @Salvodif
    MVP SharePoint Server
    • Contrassegnato come risposta Pengo11 giovedì 14 luglio 2011 10:25
    • Contrassegno come risposta annullato Pengo11 giovedì 14 luglio 2011 12:44
    • Contrassegnato come risposta Pengo11 venerdì 15 luglio 2011 09:36
    giovedì 14 luglio 2011 07:43
  • 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
    giovedì 14 luglio 2011 18:58
  • 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
    venerdì 15 luglio 2011 06:57
    Moderatore

Tutte le risposte

  • asp.net supporta i thread e le chiamate async.
    Puoi fare riferimento a questo articolo:
    http://msdn.microsoft.com/en-us/magazine/cc164036.aspx
     
    Ciao
     
     
     

    Se il post ti è tornato utile "suggerisci come risposta"
    Salvatore Di Fazio
    Bitvector
    Rebitting
    Twitter: @Salvodif
    MVP SharePoint Server
    • Contrassegnato come risposta Pengo11 giovedì 14 luglio 2011 10:25
    • Contrassegno come risposta annullato Pengo11 giovedì 14 luglio 2011 12:44
    • Contrassegnato come risposta Pengo11 venerdì 15 luglio 2011 09:36
    giovedì 14 luglio 2011 07:43
  • 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.aspx

    Ciao


    Luca Congiu (congiuluc)
    • Contrassegnato come risposta Pengo11 giovedì 14 luglio 2011 10:25
    • Contrassegno come risposta annullato Pengo11 giovedì 14 luglio 2011 12:44
    giovedì 14 luglio 2011 09:50
    Moderatore
  • 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
    giovedì 14 luglio 2011 12:50
  • 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)
    giovedì 14 luglio 2011 13:08
    Moderatore
  • 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

    giovedì 14 luglio 2011 14:34
  • Potresti mettere il risultato dell'elaborazione dentro una variabile e poi, una volta eseguita l'elaborazione utilizzare la response.

    Senza dover utilizzare altri thread.

    Ciao
    Luca Congiu (congiuluc)
    giovedì 14 luglio 2011 15:34
    Moderatore
  • Ciao,

    non ho proprio capito come e quando verificare la variabile. Dovrei in qualche modo comunicare col thread principale e passargliela per poi usare Response?

    Come l'hai pensata tu?

     

    grazie

    giovedì 14 luglio 2011 18:31
  • 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
    giovedì 14 luglio 2011 18:58
  • 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
    venerdì 15 luglio 2011 06:57
    Moderatore
  • 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
    venerdì 15 luglio 2011 09:38
  • 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
    venerdì 15 luglio 2011 10:07