ASP.NET Web Forms supporta, fin dalla versione 2.0, l'esecuzione di codice asincrono, come abbiamo visto nello script #814. L'interfaccia esposta da ASP.NET è immediata da utilizzare con l'Asynchronous Programming Model (APM), cioè quando l'esecuzione asincrona è implementata tramite la coppia di metodi Begin... e End..., dato che è sufficiente invocare tali metodi nei rispettivi handler, come mostrato nel codice in basso:
private IAsyncResult BeginProcess(object sender, EventArgs e, AsyncCallback callback, object data) { // altro codice qui .. return BeginDoingAsyncWork(callback, data); } private void EndProcess(IAsyncResult result) { // altro codice qui .. var result = EndDoingAsyncWork(result); }
Quando il flusso delle operazioni asincrone è più complesso, lo strumento migliore di cui possiamo avvalerci è però costituito dai Task, introdotti con il .NET Framework 4.0, di cui abbiamo parlato in precedenza. Essi espongono un eccellente modello a oggetti, che rende estremamente facile e intuitivo concatenare o eseguire in parallelo diverse operazioni:
var taskList = new List<Task>(); taskList.Add(Task.Factory.StartNew(() => doSomeWork())); taskList.Add(Task.Factory.StartNew(() => doSomeOtherWork()) .ContinueWith((t) => someContinuationWork())); Task.Factory.ContinueWhenAll(taskList.ToArray(), (t) => finalWork());
Grazie al codice precedente, infatti, l'esecuzione dei vari metodi doSomeWork, doSomeOtherWork, ecc... viene orchestrata secondo il flusso mostrato in figura.
Questa tecnica può essere comunque utilizzata con le Async Pages di ASP.NET, dato che l'oggetto Task implementa l'interfaccia IAsyncResult e quindi può essere utilizzato come valore di ritorno per un metodo di tipo BeginEventHandler; bisogna però ricordarsi di invocare il metodo di callback fornito da ASP.NET al termine dell'esecuzione, così che l'infrastruttura possa essere notificata della conclusione dell'operazione asincrona:
private IAsyncResult beginTasks(object sender, EventArgs e, AsyncCallback callback, object extraData) { var taskList = new List<Task>(); taskList.Add(Task.Factory.StartNew(() => doSomeWork())); taskList.Add(Task.Factory.StartNew(() => doSomeOtherWork()) .ContinueWith((t) => someContinuationWork())); var result = Task.Factory .ContinueWhenAll(taskList.ToArray(), (t) => finalWork()); // alla conclusione del flusso di task precedenti, bisogna // eseguire il metodo di callback return result.ContinueWith((task) => callback(task)); }
Per approfondimenti
Leggere un feed RSS in modalità asincrona con ASP.NET 2.0https://www.aspitalia.com/script/814/Leggere-Feed-RSS-Modalita-Asincrona-ASP.NET-2.0.aspx
Multithreading e parallelismo con il .NET Framework 4.0
https://www.winfxitalia.com/articoli/netfx4/multithreading-parallelismo.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Usare le collection expression per inizializzare una lista di oggetti in C#
Assegnare un valore di default a un parametro di una lambda in C#
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Effettuare lo stream della risposta in ASP.NET Core tramite IAsyncEnumerable
Disabilitare automaticamente un workflow di GitHub (parte 2)
Usare una container image come runner di GitHub Actions
Utilizzare politiche di resiliency con Azure Container App
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Cambiare la chiave di partizionamento di Azure Cosmos DB
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Load test di ASP.NET Core con k6
I più letti di oggi
- Impostare un elemento come ridimensionabile tramite CSS
- Proteggersi dagli attacchi di Open Redirect in ASP.NET Core MVC
- Personalizzare l'errore del rate limiting middleware in ASP.NET Core
- Accedere alla console di una Azure Container App
- Modificare i metadati nell'head dell'HTML di una Blazor Web App
- Gli oggetti CallOut di Expression Blend 4.0
- SQL Server 2005 December CTP
- Sfruttare le nuove tipologie di input di HTML5 con ASP.NET 4.0
- Upload da una pagina web con Dundas Upload