Quello di schedulare processi in background in un'applicazione web è, in assoluto, uno dei temi più ricorrenti e delle necessità più sentite. Purtroppo non esiste un modo affidabile per risolvere questo problema dato che, come ben sappiamo, in un qualsiasi momento l'AppDomain che ospita la nostra applicazione potrebbe essere riciclato per diverse ragioni. Per questa ragione, il sistema più sicuro rimane sempre quello di realizzare un Windows Service apposito, o un Worker Role/Web Job se ci troviamo su Azure.
Dal .NET Framework 4.5.2, tuttavia, è stato introdotto un metodo, denominato QueueBackgroundWorkItem, che in qualche modo riesce a darci la possibilità di eseguire codice in un'applicazione ASP.NET al di fuori di una richiesta HTTP. Per poterlo utilizzare, il primo requisito però è ovviamente quello di installare questa versione del .NET Framework, unitamente al developer pack, che troviamo a questo indirizzo: http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx
A questo punto, possiamo facilmente schedulare un processo di background con il codice seguente:
public ActionResult Index() { HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(ct)); }
Il parametro che viene fornito all'ingresso è un CancellationToken, che viene sollevato in corrispondenza dello shutdown dell'AppDomain e che, pertanto, dobbiamo periodicamente verificare all'interno del codice. Per esempio:
private void DoSomething(CancellationToken ct) { // .. gruppo di istruzioni .. ct.ThrowIfCancellationRequested(); // .. altro gruppo di istruzioni .. ct.ThrowIfCancellationRequested(); }
Il metodo ThrowIfCancellationRequested solleva un'eccezione nel caso in cui sia stato richiesto il cancel dall'esterno. Per esempio, se stiamo inviando una serie di email, potremmo invocarlo a ogni iterazione. E' molto importante effettuare periodicamente questa verifica perché l'AppDomain, in fase di shutdown, ha 90 secondi per concludere tutti i background task accodati e, se questo tempo non dovesse essere sufficiente, killerà tutto ciò che non è stato ancora eseguito.
Per concludere, QueueBackgroundWorkItem ha lo scopo di soddisfare una necessità sentita da una gran parte di sviluppatori, ma, per la natura del processo all'interno del quale viene eseguita un'applicazione web, non è da considerarsi affidabile: va quindi utilizzato solo per task brevi e non di cruciale importanza. Non c'è infatti nessuna garanzia che il task accodato venga completato o addirittura semplicemente avviato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Catturare la telemetria degli eventi di output cache in ASP.NET Core
Migliorare la scalabilità di ASP.NET Core 7 grazie all'output cache
Utilizzare la libreria EntityFrameworkCore.Exceptions per gestire le eccezioni di Entity Framework Core in modo tipizzato
Organizzare i moduli sfruttando CommonJS
Leggere e scrivere su cookie tramite Blazor
Intercettare gli eventi di creazione degli oggetti con Entity Framework 7
Migrare un repository git da Azure DevOps a GitHub
Sfruttare l'output cache di ASP.NET Core 7 con i controller
Gestire condizioni complesse in JavaScript
Effettuare test di carico con Azure Load Testing
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
GitHub <3 .NET
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Effettuare update massivi con Entity Framework Core 7
- Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
- Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
- PWAConf 2020 - Online
- Visual Studio 2010 è realtà
- Proteggersi dagli attacchi di Open Redirect in ASP.NET Core MVC
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!