Nel precedente script #1033 abbiamo visto come è possibile utilizzare i Task del .NET Framework 4.0 in una pagina ASP.NET Web Forms. A partire dalla versione 2, anche ASP.NET MVC supporta l'esecuzione di operazioni asincrone all'interno dei controller, grazie alla nuova classe base AsyncController.
Supponiamo, ad esempio, di avere la necessità di invocare un servizio esterno, che potrebbe impiegare alcuni secondi a rispondere, durante i quali il nostro web server resterebbe inutilmente bloccato. In una simile situazione, sfruttare i controller asincroni ci consente di liberare un thread sul server web così che, in attesa della conclusione della chiamata, questo possa essere sfruttato per servire una richiesta di un altro utente, migliorando pertanto la scalabilità dell'applicazione.
Un controller in grado di supportare un simile comportamento deve ereditare dalla già citata classe AsyncController ed implementare una coppia di metodi per ogni Action asincrona. Nel nostro caso, l'invocazione di un servizio di previsioni del tempo potrà essere realizzata tramite la action ShowWeather seguente:
public void ShowWeatherAsync(string zipCode) { var weatherService = new WeatherForecastSoapClient("WeatherForecastSoap"); // segnaliamo la presenza di una nuova operazione asincrona in esecuzione this.AsyncManager.OutstandingOperations.Increment(); // impostiamo il metodo di callback da eseguire al termine dell'invocazione weatherService.GetWeatherByZipCodeCompleted += (s, e) => { this.AsyncManager.Parameters["result"] = e.Result; this.AsyncManager.OutstandingOperations.Decrement(); }; weatherService.GetWeatherByZipCodeAsync(zipCode); } public ViewResult ShowWeatherCompleted(WeatherForecasts result) { return this.View(result); }
I due metodi, il cui nome è costituito dal nome della action seguito dai suffissi -Async e -Completed, hanno rispettivamente il compito di iniziare l'esecuzione asincrona e di restituire una view come ActionResult. In particolare, ShowWeatherAsync segnala innanzi tutto all'AsyncManager la presenza di una nuova operazione asincrona in corso, incrementando il contatore delle OutstandingOperations.
Successivamente imposta un metodo di callback da eseguire al termine dell'invocazione, che oltre a decrementare il contatore di conseguenza, valorizza una voce del dictionary Parameters, così che il risultato del web service possa essere fornito come parametro al metodo -Completed. ShowWeatherCompleted, infatti, presenta tale argomento nella signature del metodo, utilizzandolo direttamente come Model per la View che restituisce come risultato.
Come detto in precedenza, tale approccio è vantaggioso perché, nel caso di chiamate a Web Service, libera un thread sul server e lo rende disponibile per servire ulteriori richieste, migliorando pertanto le prestazioni dell'applicazione nel suo insieme, sebbene il tempo della singola risposta rimanga invariato. In un prossimo script vedremo invece come questo approccio possa essere sfruttato per eseguire operazioni in parallelo, rendendo più veloce anche il rendering della singola pagina.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Generare file PDF da Blazor WebAssembly con iText
Specificare il versioning nel path degli URL in ASP.NET Web API
Utilizzare il trigger SQL con le Azure Function
Eseguire una GroupBy per entity in Entity Framework
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Elencare le container images installate in un cluster di Kubernetes
Limitare le richieste lato server con l'interactive routing di Blazor 8
Hosting di componenti WebAssembly in un'applicazione Blazor static
Evitare la command injection in un workflow di GitHub
Evitare la script injection nelle GitHub Actions
Short-circuiting della Pipeline in ASP.NET Core
I più letti di oggi
- I lego? Programmabili con .NET!
- Disponibile anche il runtime di ASP.NET 2.0
- Azure Mobile Services: costruire il back-end per le app
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Release candidate per Expression Blend
- #sqlserver 2008 r2 CTP: report builder 3.0 e #businessintelligence http://u.aspitalia.com/g
- #wcfRIAservices è pronto: http://u.aspitalia.com/d4. se vuoi un'introduzione, la nostra è su http://u.aspitalia.com/d3
- segui live #futuredecoded da Roma dalle 9:30 su http://www.communitydays.it