.NET 4.5.1 ha introdotto il supporto ai task in background con la classe QueueBackgroundWorkItem. Ne abbiamo parlato in uno script precedente (https://www.aspitalia.com/script/1188/Schedulare-Processi-Background-QueueBackgroundWork-ASP.NET.aspx), e abbiamo messo in luce sia i suoi pregi, ma anche tutti i suoi limiti: prima fra tutti, la naturale inaffidabilità di questi processi, visto che non ci son garanzie che un task accodato venga effettivamente eseguito in caso di shutdown dell'applicazione.
Se abbiamo bisogno di un supporto migliore, la soluzione è sfruttare una libreria di terze parti chiamata Hangfire (http://hangfire.io). Si tratta di uno scheduler estremamente completo e affidabile, gratuito e rilasciato in licenza LGPL anche per applicazioni commerciali, con diverse caratteristiche interessanti, tra le quali:
- Utilizza uno storage per memorizzare i task (SQL Server, MSMQ o Redis), così che non siano persi anche se l'applicazione viene riavviata;
- Ci mette a disposizione una dashboard per monitorare tutti i task accodati, terminati, o in errore;
- Ha un sistema di retry automatico dei task falliti
- Supporta schedulazioni complesse, come dipendenze tra i task o i task ricorrenti
Una volta installato il package Hangfire tramite NuGet, possiamo attivarlo inserendo 3 righe di codice nella classe Startup.cs:
public void Configuration(IAppBuilder app) { // ... altro codice qui ... GlobalConfiguration.Configuration .UseSqlServerStorage("DefaultConnection"); app.UseHangfireDashboard(); app.UseHangfireServer(); }
Nel nostro caso, abbiamo scelto di sfruttare lo storage basato su Sql Server. Questa impostazione fa sì che automaticamente, al primo avvio dell'applicazione, Hangfire crei tutte le tabelle necessarie in uno schema separato.
Esistono diversi metodi per creare un nuovo task, ma il più semplice è BackgroundJob.Enqueue:
public ActionResult About() { BackgroundJob.Enqueue( () => this.SendEmail("cradle@aspitalia.com")); ViewBag.Message = "Task accodato con successo."; return View(); } public void SendEmail(string recipient) { var client = new SmtpClient(); client.Send(".....", recipient, "Hello", "This is a test email"); }
Hangfire memorizzerà il task sullo storage, che verrà poi preso in carico dallo scheduler. A questo punto non non ci resta che accedere all'indirizzo localhost:[port]/hangfire per visualizzare la dashboard, tramite cui possiamo monitorare il ciclo dei vita di tutti i task creati.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Recuperare App Service cancellati su Azure
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Gestire la cancellazione di una richiesta in streaming da Blazor
Simulare Azure Cosmos DB in locale con Docker
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Eseguire i worklow di GitHub su runner potenziati
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
I più letti di oggi
- Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
- Tracciare gli utenti connessi con ASP.NET Identity
- C# 8
- Personalizzare il comportamento di ASP.NET MVC in fase di autorizzazione
- Reactive form tipizzati con modellazione del FormBuilder in Angular
- Visual Web Developer 2005 beta 2 in download per tutti