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);
}
}
}
- Prima October Preview per ASP.NET 4.0
- Slide e demo della mia sessione ai Community Days online
- Galleria fotografica dinamica con ASP.NET AJAX
- #958 - Gestione degli errori e HttpContext con ASP.NET 3.5 SP1
- Dal MIX08 la Preview2 di ASP.NET MVC
- ASP.NET Ajax Roadmap
- Il DataSet nel web è il male
- #929 - Impersonation di utente per l'esecuzione di codice in una pagina ASP.NET
- Il modo più facile per far andare ASP.NET 3.5 sul vostro server
- #943 - Leggere feed RSS e Atom con il .NET Framework 3.5
- #936 - Aggiungere una riga con il totale calcolato al GridView
- #921 - Specificare un tipo custom come valore di un parametro di selezione dell'ObjectDataSource
Esprimi il tuo giudizio su questo script:
Per procedere devi essere autenticato.
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Stampa
Snippet
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!