<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ASP.NET</title>
        <link>http://blogs.ugidotnet.org/belius/category/ASP.NET.aspx</link>
        <description>ASP.NET</description>
        <language>it-IT</language>
        <copyright>Simone Belia</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>[UPDATE] NHibernate complex queries</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/10/16/update-nhibernate-complex-queries.aspx</link>
            <description>&lt;p&gt;Pochi giorni fa avevo scritto un &lt;a href="http://blogs.ugidotnet.org/belius/archive/2007/10/10/nhibernate-complex-queries.aspx"&gt;post&lt;/a&gt;  su come creare degli oggetti che incapsulassero le informazioni per filtrare dei dati in NH (e non solo).&lt;/p&gt;
&lt;p&gt;Questo post non è altro che una piccolissima aggiunta con l'implementazione di una classe che rappresenta l'ordine dei risultati della query.&lt;/p&gt;
&lt;div class="code"&gt;Il concetto è quello di avere una classe che contenga il campo da ordinare e la direzione di ordinamento (espressa tramite un enum).&lt;/div&gt;
&lt;div class="code"&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public class &lt;/font&gt;&lt;font color="#000000"&gt;OrderField&lt;br /&gt;
{&lt;br /&gt;
     &lt;/font&gt;&lt;font color="#0000ff"&gt;private string &lt;/font&gt;&lt;font color="#000000"&gt;_field &lt;/font&gt;&lt;font color="#0000ff"&gt;= string&lt;/font&gt;&lt;font color="#000000"&gt;.Empty&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
     private &lt;/font&gt;&lt;font color="#000000"&gt;OrderDirection _direction &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;OrderDirection.Asc&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
     public string &lt;/font&gt;&lt;font color="#000000"&gt;Field&lt;br /&gt;
     {&lt;br /&gt;
         &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_field&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
         &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _field &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;OrderDirection Direction&lt;br /&gt;
     {&lt;br /&gt;
         &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_direction&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
         &lt;/font&gt;&lt;font color="#0000ff"&gt;set &lt;/font&gt;&lt;font color="#000000"&gt;{ _direction &lt;/font&gt;&lt;font color="#0000ff"&gt;= value; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;OrderField(&lt;/font&gt;&lt;font color="#0000ff"&gt;string &lt;/font&gt;&lt;font color="#000000"&gt;field, OrderDirection direction)&lt;br /&gt;
     {&lt;br /&gt;
         _field &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;field&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
         &lt;/font&gt;&lt;font color="#000000"&gt;_direction &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;direction&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
     &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
}&lt;/font&gt; &lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public enum &lt;/font&gt;&lt;font color="#000000"&gt;OrderDirection&lt;br /&gt;
{&lt;br /&gt;
      Asc,&lt;br /&gt;
      Desc&lt;br /&gt;
}&lt;/font&gt; &lt;/div&gt;
&lt;div class="code"&gt; &lt;/div&gt;
&lt;div class="code"&gt;Visto che potrebbero verificarsi numerosi casi in cui un solo campo non basta ai fini dell'ordinamento, ho pensato fosse utile implementare una collezione che dasse la possibilità di recuperare in un colpo tutta la stringa di ordinamento.&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="code"&gt;&lt;font color="#0000ff"&gt;public class &lt;/font&gt;&lt;font color="#000000"&gt;OrderFieldList: List&amp;lt;OrderField&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#0000ff"&gt;public override string &lt;/font&gt;&lt;font color="#000000"&gt;ToString()&lt;br /&gt;
      {&lt;br /&gt;
          StringBuilder sb &lt;/font&gt;&lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;StringBuilder(&lt;/font&gt;&lt;font color="#808080"&gt;""&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
          if &lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Count &amp;gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;
          {&lt;br /&gt;
              sb.Append(&lt;/font&gt;&lt;font color="#808080"&gt;"ORDER BY "&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
              foreach &lt;/font&gt;&lt;font color="#000000"&gt;(OrderField of &lt;/font&gt;&lt;font color="#0000ff"&gt;in this&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;
              {&lt;br /&gt;
                  sb.AppendFormat(&lt;/font&gt;&lt;font color="#808080"&gt;"{0} {1},"&lt;/font&gt;&lt;font color="#000000"&gt;, of.Field, of.Direction.ToString())&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
              &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
              sb.Remove(sb.Length-&lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;font color="#800000"&gt;1&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
          &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
          &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;sb.ToString()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
}&lt;/font&gt; &lt;/div&gt;
&lt;div class="code"&gt; &lt;/div&gt;
&lt;div class="code"&gt; &lt;/div&gt;
&lt;div class="code"&gt; ...e per finire la sua implementazione ai fini pratici è:&lt;/div&gt;
&lt;div class="code"&gt; &lt;/div&gt;
&lt;div class="code"&gt;&lt;font color="#0000ff"&gt;string &lt;/font&gt;&lt;font color="#000000"&gt;hql &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#808080"&gt;"select c from Customer c where c.Country = :country"&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#006400"&gt;                &lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;OrderFieldList ofl &lt;/font&gt;&lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;OrderFieldList()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;ofl.Add(&lt;/font&gt;&lt;font color="#0000ff"&gt;new &lt;/font&gt;&lt;font color="#000000"&gt;OrderField(&lt;/font&gt;&lt;font color="#808080"&gt;"BirthDate"&lt;/font&gt;&lt;font color="#000000"&gt;, OrderDirection.Desc))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;ofl.Add(&lt;/font&gt;&lt;font color="#0000ff"&gt;new &lt;/font&gt;&lt;font color="#000000"&gt;OrderField(&lt;/font&gt;&lt;font color="#808080"&gt;"LastName"&lt;/font&gt;&lt;font color="#000000"&gt;, OrderDirection.Asc))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;hql +&lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;ofl.ToString()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;font color="#006400"&gt;//..........&lt;br /&gt;
//..........&lt;br /&gt;
//..........&lt;/font&gt; &lt;/div&gt;
&lt;div class="code"&gt;&lt;/div&gt;
&lt;div class="code"&gt;....a presto!!!&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88973.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/10/16/update-nhibernate-complex-queries.aspx</guid>
            <pubDate>Tue, 16 Oct 2007 14:37:24 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/10/16/update-nhibernate-complex-queries.aspx#feedback</comments>
            <slash:comments>53</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88973.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88973.aspx</trackback:ping>
        </item>
        <item>
            <title>Dynamic Data Controls for ASP.NET</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/10/15/dynamic-data-controls-for-asp.net.aspx</link>
            <description>&lt;p&gt;&lt;font face="Arial"&gt;Microsoft ha messo a disposizione da poco tempo un'estensione di ASP.NET chiamata Dynamic Data Controls.&lt;br /&gt;
Questa estensione non è altro che una libreria di controlli che collegandosi ad un DB ne recupera lo schema e genera a runtime tutte le pagine che sono necessarie al dataentry e la visualizzazione delle tabelle.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;L'estensione potete trovarla a questo indirizzo:  &lt;font face="Arial"&gt;&lt;a href="http://www.asp.net/downloads/futures/"&gt;http://www.asp.net/downloads/futures/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt;Ancora una volta le scelte che fa Microsoft mi fatto restare a bocca aperta. Stanno lavorando moltissimo su LINQ e l'EF eppure tirano fuori un set di controlli che vanno completamente contro al DDD.&lt;/p&gt;
&lt;p&gt;[Pensiero] :-)&lt;br /&gt;
...valà, non dirmi che anche i dipendenti Ms hanno il vicino rompi che gli dice...."dai fammi un programmino per la gestione dei miei dvd...tanto per te che ci capisci è un attimo".&lt;br /&gt;
Se questo fosse, allora mi scuso e ringrazio!!&lt;br /&gt;
&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88945.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/10/15/dynamic-data-controls-for-asp.net.aspx</guid>
            <pubDate>Mon, 15 Oct 2007 10:35:27 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/10/15/dynamic-data-controls-for-asp.net.aspx#feedback</comments>
            <slash:comments>60</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88945.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88945.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET AJAX File Download</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/10/12/asp.net-ajax-file-download.aspx</link>
            <description>&lt;p&gt;&lt;a&gt;&lt;/a&gt;Molte volte è necessario permettere agli utenti di scaricare dei file dalle nostre applicazioni ASP.NET, in maniera un pò più elaborata del semplice link alla risorsa. Mettete per esempio che il file da scaricare non esista, ma viene generato durante il postback, oppure mettete che per sicurezza i file stanno all'interno di una cartella del server non raggiungibile tramite Http. &lt;/p&gt;
&lt;p&gt;Le metodologie per venire incontro a queste problematiche sono state documentate tantissime volte, ma se voglio utilizzarle con AJAX si devono utilizzare dei trucchetti, proprio perchè, come per l'upload di file, AJAX non permette il download asincrono delle risorse.... &lt;/p&gt;
&lt;p&gt;In questo post troverete uno di questi trucchetti...e spero che vi faccia comodo come lo ha fatto a me!!! :-) &lt;/p&gt;
&lt;p&gt;Il trucchetto consiste di crearsi un HttpHandler che si occupi di recuperare la risorsa e che la restituisca sottoforma di stream nella Response. Logicamente l'handler potendo accedere al contesto e quindi il QueryString e quant'altro potrà effettuare tutti suoi controlli di sicurezza prima di restituire il file.....non me ne vogliano...ma in poche parole non fate come &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2007/10/04/88715.aspx"&gt;loro&lt;/a&gt;  :-) &lt;/p&gt;
&lt;p&gt;Successivamente nelle pagine dove è presente uno scriptmanager ed uno o più updatepanel si dovrà aggiungere questo frammento di codice JavaScript: &lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;function &lt;/font&gt;GetFile(parm) &lt;br /&gt;
&lt;font color="#0000ff"&gt;{ &lt;br /&gt;
   var &lt;font color="#000000"&gt;iframe &lt;/font&gt;&lt;font color="#000000"&gt;= document.createElement(&lt;font color="#993300"&gt;"iframe"&lt;/font&gt;); &lt;br /&gt;
   iframe.src = &lt;font color="#993300"&gt;"Downloader.ashx?id="&lt;/font&gt; + parm; &lt;br /&gt;
   iframe.style.display = &lt;font color="#993300"&gt;"none"&lt;/font&gt;; &lt;br /&gt;
  document.body.appendChild(iframe); &lt;br /&gt;
&lt;/font&gt;}&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Il Javascript non fa altro che creare un tag iframe, impostare come src il nostro handler ed aggiungerlo alla pagina. In questa maniera noi possiamo tranquillamente aggiungere ad un bottone che si occupa di scaricare il file il seguente codice: &lt;/p&gt;
&lt;br /&gt;
&lt;font color="#2b91af" size="2"&gt;ScriptManager&lt;/font&gt;&lt;font size="2"&gt;.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;"download"&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;"GetFile('5648752168497');"&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;true&lt;/font&gt;&lt;font size="2"&gt;); &lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;che "dice" allo scriptmanager della pagina di eseguire la funzione Javascript GetFile passandogli come parametro (in questo esempio un numerone di prova) un qualcosa che vi permetta di capire quale file scaricare. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Il codice di esempio lo potete scaricare da &lt;a href="http://www.beliusoft.com/public/filedownload.rar"&gt;qui&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88911.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/10/12/asp.net-ajax-file-download.aspx</guid>
            <pubDate>Fri, 12 Oct 2007 12:55:53 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/10/12/asp.net-ajax-file-download.aspx#feedback</comments>
            <slash:comments>24</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88911.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88911.aspx</trackback:ping>
        </item>
        <item>
            <title>Tutto dinamico.....ma ora c'è AJAX</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/10/01/tutto-dinamico.aspx</link>
            <description>&lt;p&gt;Chi è che non si è mai trovato difronte alla problematica di Web User Control caricati dinamicamente? &lt;em&gt;&lt;font size="1"&gt;(la risposta dovrebbe essere "chi non lavora con ASP.NET"....ma fate finta che non ho detto nulla) :)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In ogni caso, la problematica è sempre la stessa: &lt;/p&gt;
&lt;p&gt;dobbiamo stare attenti a quando questi vengono creati in quanto se aggiungo uno o più eventi ai controlli caricati a runtime questi non vengono catturati se non ho lo WUC presente entro il Page_Load.&lt;/p&gt;
&lt;p&gt;Poco male....visto la  miriade di post che ci sono al riguardo e che per un verso e per un altro fanno tutti lo stesso giro.&lt;/p&gt;
&lt;p&gt;La cosa però si complica se oltre ad utilizzare questa metodologia si vuole anche utilizzare AJAX ed un controllo File Upload aggiunto a runtime.&lt;/p&gt;
&lt;p&gt;La tecnologia AJAX infatti non riesce a fare upload di file in modo asincontrono e proprio per questo è buona norma mettere il controllo FileUpload all'esterno di un UpdatePanel, così da avere un postback completo.&lt;br /&gt;
Se però il controllo deve essere per forza dentro un UpdatePanel si può traquillamente inserire un Trigger nel pannello al fine di permettere il Postback completo quando si usa il FileUpload.&lt;br /&gt;
&lt;br /&gt;
Nel mio caso avevo dei pulsanti che inserivano dei WUC a runtime richiamando un metodo ed impostando il ViewState con le informazioni essenziali per ricreare i controlli al successivo postback. Nel Page_Load controllavo il ViewState e se questo non era vuoto ricreavo i WUC (così da permettere agli stessi di intercettare l'evento) e tutto andava che era una meraviglia.&lt;br /&gt;
&lt;br /&gt;
Aggiungendo AJAX però tutto ciò non funzionava come volevo, in quanto ogni volta che richiamavo un evento asincrono dei controlli creati a runtime, il trigger che diceva di fare un Postback completo al controllo FileUpload andava a farsi friggere.&lt;br /&gt;
Dopo una mezza giornata di testate contro il muro o provato a fare una cosa.....ho creato l'override del metodo &lt;strong&gt;CreateChildControls&lt;/strong&gt; ed ho inserito qua dentro la "ricreazione" dei controlli così da anticipare il &lt;strong&gt;Page_Load&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ora tutto funziona......ma quanto ci sarebbe da dire rispetto all'ordine di richiamo dei metodi e degli eventi del Framework.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88638.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/10/01/tutto-dinamico.aspx</guid>
            <pubDate>Mon, 01 Oct 2007 15:01:49 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/10/01/tutto-dinamico.aspx#feedback</comments>
            <slash:comments>27</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88638.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88638.aspx</trackback:ping>
        </item>
        <item>
            <title>Operazioni Lunghe con ASP.NET e AJAX</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/09/13/operazioni-lunghe-con-asp.net-e-ajax.aspx</link>
            <description>&lt;p&gt;Diverse volte mi è capitato di dover eseguire operazioni batch abbastanza lunghe su delle Web Application che duravano anche qualche minuto.&lt;/p&gt;
&lt;p&gt;L'utente che quindi premeva il fatidico pulsante "Start" non poteva utilizzare nessuna altra sezione dell'applicazione poichè avrebbe interroto inevitabilmente l'operazione in corso.&lt;br /&gt;
Dopo tante richieste da parte di questi utenti ho deciso di documentarmi meglio e, leggendo di qua e prendendo spunto di la sono riuscito a creare un paio di classi che permettono di eseguire le operazioni lunghe "dietro le quinte" permettendo agli utenti di continuare a lavorare.&lt;/p&gt;
&lt;p&gt;Se poi consideriamo il fatto che AJAX ci sta dando una grossa mano per rendere più "vere" le Web Application allora siamo a cavallo. :-)&lt;/p&gt;
&lt;p&gt; L'implementazione si riassume in due classi Task.cs e SampleTask.cs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TASK.CS&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
 &lt;font color="#0000ff"&gt;public abstract class &lt;/font&gt;&lt;font color="#000000"&gt;Task&lt;br /&gt;
 {&lt;br /&gt;
     &lt;/font&gt;&lt;font color="#0000ff"&gt;protected bool &lt;/font&gt;&lt;font color="#000000"&gt;_running &lt;/font&gt;&lt;font color="#0000ff"&gt;= false;&lt;br /&gt;
    public bool &lt;/font&gt;&lt;font color="#000000"&gt;Running&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_running&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;protected &lt;/font&gt;&lt;font color="#000000"&gt;Exception _exception &lt;/font&gt;&lt;font color="#0000ff"&gt;= null;&lt;br /&gt;
    public &lt;/font&gt;&lt;font color="#000000"&gt;Exception Exception&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_exception&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;public void &lt;/font&gt;&lt;font color="#000000"&gt;StartTask()&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;lock &lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;if &lt;/font&gt;&lt;font color="#000000"&gt;(!_running)&lt;br /&gt;
            {&lt;br /&gt;
                _running &lt;/font&gt;&lt;font color="#0000ff"&gt;= true;&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#000000"&gt;Thread tTask &lt;/font&gt;&lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;Thread(&lt;/font&gt;&lt;font color="#0000ff"&gt;new &lt;/font&gt;&lt;font color="#000000"&gt;ThreadStart(Process))&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#000000"&gt;tTask.Start()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;public virtual void &lt;/font&gt;&lt;font color="#000000"&gt;StopTask()&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;._running &lt;/font&gt;&lt;font color="#0000ff"&gt;= false;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;public virtual void &lt;/font&gt;Process() { }&lt;br /&gt;
    &lt;br /&gt;
} &lt;/p&gt;
&lt;p&gt;Questa classe è astratta poichè fornisce l'implementazione base di tutte le eventuali operazioni che richiedo un certo tempo di esecuzione.&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;&lt;font color="#000000"&gt;SAMPLETASK.CS&lt;/font&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
public class &lt;/font&gt;&lt;font color="#000000"&gt;SampleTask : Task&lt;br /&gt;
{&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;public &lt;/font&gt;&lt;font color="#000000"&gt;SampleTask() { }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;private int &lt;/font&gt;&lt;font color="#000000"&gt;_step &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
    public int &lt;/font&gt;&lt;font color="#000000"&gt;Step&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;get &lt;/font&gt;&lt;font color="#000000"&gt;{ &lt;/font&gt;&lt;font color="#0000ff"&gt;return &lt;/font&gt;&lt;font color="#000000"&gt;_step&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;public override void &lt;/font&gt;&lt;font color="#000000"&gt;Process()&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;try&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;for &lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;int &lt;/font&gt;&lt;font color="#000000"&gt;i &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#800000"&gt;0&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;i &amp;lt; &lt;/font&gt;&lt;font color="#800000"&gt;100&lt;/font&gt;&lt;font color="#0000ff"&gt;; &lt;/font&gt;&lt;font color="#000000"&gt;i++)&lt;br /&gt;
            {&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#0000ff"&gt;if &lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;font color="#000000"&gt;.Running)&lt;br /&gt;
                {&lt;br /&gt;
                    _step &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;i&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
                    &lt;/font&gt;&lt;font color="#000000"&gt;System.Threading.Thread.Sleep(&lt;/font&gt;&lt;font color="#800000"&gt;200&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
                    &lt;/font&gt;&lt;font color="#006400"&gt;//if (i&amp;gt;20)&lt;br /&gt;
                    //    throw new ArgumentException("Exception occurred");&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#0000ff"&gt;else&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;
                    &lt;/font&gt;&lt;font color="#0000ff"&gt;break;&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;catch &lt;/font&gt;&lt;font color="#000000"&gt;(Exception e)&lt;br /&gt;
        {&lt;br /&gt;
            _exception &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;e&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;finally&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;
            _running &lt;/font&gt;&lt;font color="#0000ff"&gt;= false;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;public override void &lt;/font&gt;&lt;font color="#000000"&gt;StopTask()&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;font color="#000000"&gt;.StopTask()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
}&lt;/font&gt; &lt;br /&gt;
&lt;br /&gt;
Questa classe invece rappresenta la vera operazione che deve essere eseguita.&lt;br /&gt;
In pratica quando quando viene richiamato StartTask il codice non fa altro che creare un nuovo Thread per eseguire il metodo Process().&lt;br /&gt;
Come si vede la classe SampleTask.cs espone una proprietà pubblica Step che identifica il punto dove è arrivato il lavoro, e se dovessero essere sollevate delle eccezioni non fa altro che riempire il field _exception che viene esposto tramite una proprietà dalla classe base.&lt;/p&gt;
&lt;p&gt;Il fatto che l'operazione viene eseguita su un altro thread ecco che abbiamo risolto il primo problema....ovvero che una volta che l'utente lancia l'operazione puo continuare a lavorare su altre parti dell'applicazione.&lt;/p&gt;
&lt;p&gt;Il secondo problema invece era quello di capire a che punto era arrivata l'operazione.&lt;br /&gt;
Nel progetto che troverete in allegato ci sono due pagine una Default.aspx ed una Pagina2.aspx.....la default è la pagina che realmente fa tutto mentre la pagina2 l'ho messa solo per simulare un'altra sezione utilizzata dall'utente.&lt;br /&gt;
&lt;br /&gt;
Nella default.aspx ho messo questo codice&lt;/p&gt;
&lt;p&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:ScriptManager&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;="ScriptManager1"&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&lt;/font&gt;&lt;font color="#ff0000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;font color="#000000"&gt;        &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:UpdatePanel&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;="upTask"&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;ContentTemplate&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:Timer&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;="Timer1"&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&lt;/font&gt;&lt;font color="#ff0000"&gt; Interval&lt;/font&gt;&lt;font color="#0000ff"&gt;="1000"&lt;/font&gt;&lt;font color="#ff0000"&gt; Enabled&lt;/font&gt;&lt;font color="#0000ff"&gt;="False"&lt;/font&gt;&lt;font color="#ff0000"&gt; OnTick&lt;/font&gt;&lt;font color="#0000ff"&gt;="Timer1_Tick"&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;asp:Timer&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
                &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:Button&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;="btnStart"&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&lt;/font&gt;&lt;font color="#ff0000"&gt; Text&lt;/font&gt;&lt;font color="#0000ff"&gt;="Start"&lt;/font&gt;&lt;font color="#ff0000"&gt; OnClick&lt;/font&gt;&lt;font color="#0000ff"&gt;="btnStart_Click"&lt;/font&gt;&lt;font color="#ff0000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;
                &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:Button&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;="btnStop"&lt;/font&gt;&lt;font color="#ff0000"&gt; Visible&lt;/font&gt;&lt;font color="#0000ff"&gt;="false"&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&lt;/font&gt;&lt;font color="#ff0000"&gt; Text&lt;/font&gt;&lt;font color="#0000ff"&gt;="Stop"&lt;/font&gt;&lt;font color="#ff0000"&gt; OnClick&lt;/font&gt;&lt;font color="#0000ff"&gt;="btnStop_Click"&lt;/font&gt;&lt;font color="#ff0000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;br&lt;/font&gt;&lt;font color="#ff0000"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;br /&gt;
                &amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;asp:Label&lt;/font&gt;&lt;font color="#ff0000"&gt; ID&lt;/font&gt;&lt;font color="#0000ff"&gt;="lblStep"&lt;/font&gt;&lt;font color="#ff0000"&gt; runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;asp:Label&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;ContentTemplate&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;asp:UpdatePanel&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;All'interno dell'UpdatePanel sono presenti due bottoni Start e Stop una label per visualizzare i messagi di avanzamento del lavoro ed un ajax timer che ci permetterà ogni secondo di controllare lo stato del Task.&lt;/p&gt;
&lt;font color="#0000ff"&gt;private &lt;/font&gt;&lt;font color="#000000"&gt;SampleTask _task &lt;/font&gt;&lt;font color="#0000ff"&gt;= null;&lt;br /&gt;
    protected void &lt;/font&gt;&lt;font color="#000000"&gt;Page_Load(&lt;/font&gt;&lt;font color="#0000ff"&gt;object &lt;/font&gt;&lt;font color="#000000"&gt;sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        _task &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;Cache[&lt;/font&gt;&lt;font color="#808080"&gt;"TASK"&lt;/font&gt;&lt;font color="#000000"&gt;] &lt;/font&gt;&lt;font color="#0000ff"&gt;as &lt;/font&gt;&lt;font color="#000000"&gt;SampleTask&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        if &lt;/font&gt;&lt;font color="#000000"&gt;(_task !&lt;/font&gt;&lt;font color="#0000ff"&gt;= null&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;if &lt;/font&gt;&lt;font color="#000000"&gt;(_task.Running)&lt;br /&gt;
            {&lt;br /&gt;
                TaskRunning()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#0000ff"&gt;else&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;
                TaskNotRunning()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
            &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;protected void &lt;/font&gt;&lt;font color="#000000"&gt;TaskRunning()&lt;br /&gt;
    {&lt;br /&gt;
        Timer1.Enabled &lt;/font&gt;&lt;font color="#0000ff"&gt;= true;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;btnStart.Visible &lt;/font&gt;&lt;font color="#0000ff"&gt;= false;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;btnStop.Visible &lt;/font&gt;&lt;font color="#0000ff"&gt;= true;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;protected void &lt;/font&gt;&lt;font color="#000000"&gt;TaskNotRunning()&lt;br /&gt;
    {&lt;br /&gt;
        Timer1.Enabled &lt;/font&gt;&lt;font color="#0000ff"&gt;= false;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;btnStart.Visible &lt;/font&gt;&lt;font color="#0000ff"&gt;= true;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;btnStop.Visible &lt;/font&gt;&lt;font color="#0000ff"&gt;= false;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;lblStep.Text &lt;/font&gt;&lt;font color="#0000ff"&gt;= string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;"Task inattivo"&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
&lt;br /&gt;
        if &lt;/font&gt;&lt;font color="#000000"&gt;(_task.Exception !&lt;/font&gt;&lt;font color="#0000ff"&gt;= null&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;
        {&lt;br /&gt;
            lblStep.Text &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;_task.Exception.Message&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;protected void &lt;/font&gt;&lt;font color="#000000"&gt;btnStart_Click(&lt;/font&gt;&lt;font color="#0000ff"&gt;object &lt;/font&gt;&lt;font color="#000000"&gt;sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        _task &lt;/font&gt;&lt;font color="#0000ff"&gt;= new &lt;/font&gt;&lt;font color="#000000"&gt;SampleTask()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;Cache[&lt;/font&gt;&lt;font color="#808080"&gt;"TASK"&lt;/font&gt;&lt;font color="#000000"&gt;] &lt;/font&gt;&lt;font color="#0000ff"&gt;= &lt;/font&gt;&lt;font color="#000000"&gt;_task&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;_task.StartTask()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;TaskRunning()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;protected void &lt;/font&gt;&lt;font color="#000000"&gt;btnStop_Click(&lt;/font&gt;&lt;font color="#0000ff"&gt;object &lt;/font&gt;&lt;font color="#000000"&gt;sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        _task.StopTask()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;Cache.Remove(&lt;/font&gt;&lt;font color="#808080"&gt;"TASK"&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;TaskNotRunning()&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
        &lt;/font&gt;&lt;font color="#000000"&gt;lblStep.Text &lt;/font&gt;&lt;font color="#0000ff"&gt;= string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;"Task interrotto"&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;font color="#0000ff"&gt;;    &lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;br /&gt;
    &lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff"&gt;protected void &lt;/font&gt;&lt;font color="#000000"&gt;Timer1_Tick(&lt;/font&gt;&lt;font color="#0000ff"&gt;object &lt;/font&gt;&lt;font color="#000000"&gt;sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        lblStep.Text &lt;/font&gt;&lt;font color="#0000ff"&gt;= string&lt;/font&gt;&lt;font color="#000000"&gt;.Format(&lt;/font&gt;&lt;font color="#808080"&gt;"Operazioni concluse: {0}"&lt;/font&gt;&lt;font color="#000000"&gt;, _task.Step)&lt;/font&gt;&lt;font color="#0000ff"&gt;;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;come si vede nel codebehind della pagina viene registrato in Cache la classe e viene controllata ad ogni Caricamento della pagina se la classe SampleTask è presente o meno nella cache comportandosi di conseguenza.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Il progetto di esempio lo potete scaricare da &lt;a href="http://www.beliusoft.com/public/LongTask.rar"&gt;qui&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88301.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/09/13/operazioni-lunghe-con-asp.net-e-ajax.aspx</guid>
            <pubDate>Thu, 13 Sep 2007 11:10:35 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/09/13/operazioni-lunghe-con-asp.net-e-ajax.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88301.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88301.aspx</trackback:ping>
        </item>
    </channel>
</rss>