Tempo fa mi ero imbattuto in un problema che credo abbiamo incontrato il 99% degli sviluppatori web: lanciare un'operazione che impiega diverso tempo per l'esecuzione (Long running task).
Descrizione del problema
La cosa più sgradevole per un utente è avere la sensazione che la pagina web si sia bloccata, vedendo il browser in "caricamento" ma non vedendo un risultato in tempi brevi.
Nel mio caso l'applicazione lancia un pacchetto SSIS su SQL Server per importare ed elaborare dati da file Excel. Quando i dati raggiungono una certa sostanza, l'esecuzione può durare anche qualche minuto. Pensate cosa significa fissare un browser vuoto, con la barra di caricamento praticamente ferma. A me già 15 secondi danno fastidio!!!!!
Possibili soluzioni
Dando una risposta al problema in maniera veloce ed istintiva, mi vengono in mente tre o quattro possibili soluzioni per dare una sorta di "speranza" all'utente.
Partiamo dalla più semplice e veloce: utilizzare il Parial Rendering con un UpdatePanel ed un UpdateProgress. I questo modo possiamo per lo meno creare una piccola interfaccia di attesa mentre il codice lato server rimane in esecuzione. A parte una minore (molto minore) frustrazione da parte dell'utente, questa soluzione si può applicare a situazioni dove l'attesa non supera il minuto, anche perché in genere i timeout di ambiante sono settati a 2 minuti, e dove non è necessario avere feedback durante l'esecuzione del codice.
Altra soluzione, simile ma più elaborata, si può implementare attraverso una chiamata AJAX pura. Possiamo implementare un WebService piuttosto che un PageMethod, piuttosto che una semplice pagina aspx che espone una funzione da poter chiamare tramite una classe Proxy creata con ASP.NET AJAX, oppure JQuery, MooTools o qualsiasi altro metodo di implementazione. Questa soluzione prevede la consocenza della metodologia AJAX e una seppur piccola parte di programmazione lato Client per la modifica dell'interfaccia e l'interazione con l'utente.
Precisando che la soluzione AJAX è molto valida e che permette elasticità e personalizzazione, voglio proporre comuque una terza soluzione, basata prevalentemente su ASP.NET senza ausilio di javascript.
La soluzione completa