<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>Tips</title>
        <link>http://blogs.ugidotnet.org/belius/category/Tips.aspx</link>
        <description>Tips</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>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>3rd parties components....che uso</title>
            <link>http://blogs.ugidotnet.org/belius/archive/2007/09/16/3rd-parties-components.che-uso.aspx</link>
            <description>&lt;p&gt;Sviluppare applicazioni, "inventandosi ogni volta la ruota" per fare una funzionalità piuttosto che un'altra è un bagno di sangue........proprio per questo penso che il 99% delle applicazioni che vengono sviluppate fanno largo uso di components sviluppati da terze parti.&lt;/p&gt;
&lt;p&gt;Visto che sono un grande amante del "gratuito" qua sotto vi riporto un elenco di quelli che utilizzo io più di frequente in quasi tutti i miei progetti Web.&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Intelligencia UrlRewriting (&lt;font face="Arial"&gt;&lt;a href="http://urlrewriter.net/"&gt;http://urlrewriter.net/&lt;/a&gt;)&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;Excentrics World Controls (&lt;font face="Arial"&gt;&lt;a href="http://www.eworldui.net/"&gt;http://www.eworldui.net/&lt;/a&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;CarlosAg Excel Xml Writer (&lt;font face="Arial"&gt;&lt;a href="http://www.carlosag.net/Tools/ExcelXmlWriter/Default.aspx"&gt;http://www.carlosag.net/Tools/ExcelXmlWriter/Default.aspx&lt;/a&gt;)&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;SharpZipLib (&lt;font face="Arial"&gt;&lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/"&gt;http://www.icsharpcode.net/OpenSource/SharpZipLib/&lt;/a&gt;) (forse non c'era bisogno di metterlo! :-) )&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;....poi vabbè ce n'è qualcuno a pagamento.....ma quando "ce vò ce vò":&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;BarCode Generator (&lt;font face="Arial"&gt;&lt;a href="http://www.aspose.com/wiki/default.aspx/Aspose.BarCode/ProductOverview.html"&gt;http://www.aspose.com/wiki/default.aspx/Aspose.BarCode/ProductOverview.html&lt;/a&gt;)&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;Pdf Generator (&lt;font face="Arial"&gt;&lt;a href="http://www.aspose.com/wiki/default.aspx/Aspose.Pdf/ProductOverview.html"&gt;http://www.aspose.com/wiki/default.aspx/Aspose.Pdf/ProductOverview.html&lt;/a&gt;)&lt;/font&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;E voi? quali usate?&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/belius/aggbug/88359.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Simone Belia</dc:creator>
            <guid>http://blogs.ugidotnet.org/belius/archive/2007/09/16/3rd-parties-components.che-uso.aspx</guid>
            <pubDate>Sun, 16 Sep 2007 13:46:06 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/belius/archive/2007/09/16/3rd-parties-components.che-uso.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/belius/comments/commentRss/88359.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/belius/services/trackbacks/88359.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>