Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
ASP.NET MVC 2: costruire un controller asincrono (2/9)
Scritto da Fabio Carucci il 23-11-2010 ore 08:49
La classe PostsBlogService contiene al suo interno il metodo GetTitles(), che restituisce i titoli dei post:
  1. ....        
  2.         public ViewStringModel GetTitles(string blog)
  3.         {
  4.             DoSleep();
  5.             string[] postBlog = new string[_titles.Length];
  6.             for (int i = 0; i < _titles.Length; i++)
  7.                 postBlog<i> = blog + " " + _titles<i>;
  8.  
  9.             return new ViewStringModel
  10.             {
  11.                 PostsBlog = postBlog
  12.             };
  13.         }
  14.  
  15.         public string[] GetTitlesBlog(string blog)
  16.         {
  17.             DoSleep();
  18.             string[] postBlog = new string[_titles.Length];
  19.             for (int i = 0; i < _titles.Length; i++)
  20.                 postBlog<i> = blog + " " + _titles<i>;
  21.             return postBlog;
  22.         }
  23. ....</i></i></i></i>
Prima di proseguire con il codice della classe occorre creare la classe seguente, che servirà in seguito per gestire la sincronizzazione dei metodi asincroni:
  1. public class StringArrayEventArgs : EventArgs
  2.     {
  3.         public string[] Value;
  4.     }
Si può riprendere ora il codice della classe PostsBlogService con la dichiarazione di un evento, che intercetterà il termine dell'esecuzione del metodo asincrono; la classe SyncCont fa uso di System.Threading.SynchronizationContext e propaga un contesto di sincronizzazione. Nel metodo asincrono GetTitlesAsync() si passa la stringa del blog alla classe SynchronizationContext e a sua volta si istanzia un Threading.Timer:
  1. ....
  2.         public event EventHandler<StringArrayEventArgs> GetTitlesCompleted;
  3.  
  4.         class SyncCont
  5.         {
  6.             public SyncCont(SynchronizationContext scon, string Blog)
  7.             {
  8.                 sc = scon; blog = Blog;
  9.             }
  10.             public SynchronizationContext sc { get; private set; }
  11.             public String blog { get; private set; }
  12.         }
  13.  
  14.         public void GetTitlesAsync(string blog)
  15.         {
  16.             TimerCallback timerDelegate = new TimerCallback(HandleTimerCallback);
  17.             SyncCont rc = new SyncCont(SynchronizationContext.Current, blog);
  18.             Timer timer = new Timer(timerDelegate, rc, 0, Timeout.Infinite);
  19.             HttpContext.Current.Items[this] = timer;
  20.         }
  21.  
  22.         private void HandleTimerCallback(object state)
  23.         {        
  24.             SyncCont rc = (SyncCont)state;
  25.             SynchronizationContext syncContext = rc.sc;
  26.             syncContext.Send(FireEventSynchronously, rc.blog);
  27.         }
  28.  
  29.         private void FireEventSynchronously(object state)
  30.         {
  31.             StringArrayEventArgs e = new StringArrayEventArgs()
  32.             {
  33.                 Value = GetTitlesBlog((string)state)
  34.             };
  35.             OnGetTitlesCompleted(e);
  36.         }
  37.  
  38. 		private void OnGetTitlesCompleted(StringArrayEventArgs e)
  39.         {
  40.             EventHandler<StringArrayEventArgs> handler = GetTitlesCompleted;
  41.             if (handler != null)
  42.             {
  43.                 handler(this, e);
  44.             }
  45.         }
  46.  
  47.         public void GetTitlesAsync()
  48.         {
  49.             SynchronizationContext syncContext = SynchronizationContext.Current;
  50.             Timer timer = new Timer(state =>
  51.                 syncContext.Send(d => OnGetTitlesCompleted(new StringArrayEventArgs()
  52.                 {
  53.                     Value = _titles
  54.                 }), state),
  55.                 null, 111, Timeout.Infinite);
  56.             HttpContext.Current.Items[this] = timer;
  57.         }
  58.     }
  59. }
Il suddetto OnGetTitlesCompleted() è un metodo che contiene la notifica dell'avvenuto completamento di GetTitleAsync().
Precedente: Java e NetBeans, arriva la versione 7 Beta
Successiva: CCAN, un archivio per condividere e sviluppare codice in C
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.304 secondi.