Leggere un feed RSS in modalità asincrona con ASP.NET 2.0

di Riccardo Golia, in UserScript, ASP.NET 2.0, C#,

Quando riceve una richiesta per una pagina, il runtime di ASP.NET recupera dal pool un thread e lo assegna alla richiesta. Normalmente la richiesta viene processata in modalità sincrona tramite un handler che implementa l'interfaccia IHttpHandler e il thread relativo viene mantenuto allocato per tutto il tempo necessario fino al completamento dell'elaborazione.

Se una richiesta necessita dell'uso di una risorsa esterna che può portare ad un ritardo significativo nell'invio della risposta (per esempio, un web service o un feed RSS), l'approccio sincrono può rivelarsi non ottimale, in quanto il thread rimane inutilmente allocato anche durante il periodo di attesa. In uno scenario come quello ipotizzato, la scalabilità dell'applicazione può rivelarsi compromessa. Infatti il thread pool ha una capacità finita e l'eventuale impossibilità di allocare nuovi thread costringe il runtime ad incodare le richieste in attesa che un thread si liberi.

ASP.NET 2.0 affronta questo problema introducendo le pagine asincrone. Esse presentano un ciclo di vita modificato rispetto alla situazione sincrona, dato che vengono processate tramite un handler che implementa l'interfaccia IHttpAsyncHandler. Il thread viene liberato e restituito al pool nel momento in cui una operazione asincrona viene avviata nella pagina. Al termine dell'operazione, il thread viene riallocato per completare l'elaborazione della richiesta e per restituire la risposta attesa.

Per definire una pagina come asincrona occorre innanzitutto inserire l'attributo Async nell'ambito della direttiva @Page.

<%@ Page Async="true" Language="C#" CodeFile="AsyncPageDemo.aspx.cs" Inherits="AsyncPageDemo" %>
<form id="AsyncForm" runat="server">
<asp:Literal ID="AsyncResult" runat="server" />
</form>

La presenza dell'attributo Async permette di registrare nel codefile della pagina gli handler di tipo asincrono dell'evento PreRenderComplete. La registrazione viene fatta richiamando il metodo AddOnPreRenderCompleteAsync(BeginEventHandler, EndEventHandler) della classe Page, indicando tramite i relativi delegate i metodi per l'attivazione e il completamento dell'elaborazione asincrona.

L'esempio riportato si riferisce alla lettura di un feed RSS in modalità asincrona.

public partial class AsyncPageDemo : System.Web.UI.Page
{
  private System.Net.WebRequest _request;

  protected override void OnLoad(EventArgs e)
  {
    this.AddOnPreRenderCompleteAsync(new BeginEventHandler(this.BeginProcess), new EndEventHandler(this.EndProcess));
  }

  private IAsyncResult BeginProcess(object sender, EventArgs e, AsyncCallback callback, object extraData)
  {
    _request = System.Net.WebRequest.Create("http://blogs.aspitalia.com/rickyvr/rss.aspx");
    return _request.BeginGetResponse(callback, extraData);
  }

  private void EndProcess(IAsyncResult result)
  {
    string buffer = string.Empty;
    using (System.Net.WebResponse response = _request.EndGetResponse(result))
    {
      System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream());
      buffer = reader.ReadToEnd();
      reader.Dispose();

      this.AsyncResult.Text = HttpUtility.HtmlEncode(buffer);
    }
  }
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi