Nello sviluppo di qualsiasi soluzione, l'uso di array o collezioni è all'ordine del giorno, così come l'adozione di code per mantenere in memoria un elenco di richieste o di elementi con un approccio FIFO (First Input, First Output).
Nel .NET Framework la classe Queue soddisfa questa richiesta, ma in situazioni concorrenziali questa non è adatta a gestire richiese contemporanee di accodamento e scodamento. Sebbene è possibile sfruttare il lock/syncLock per l'accesso alla collezione, questa tecnica fornisce scarse prestazioni e va quindi evitata. Con il .NET Framework 4.0 è stata introdotta la classe generica ConcurrentQueue che, come il nome suggerisce, è thread-safe ed è adatta a scenari di concorrenza.
Il suo utilizzo è piuttosto semplice, ma allo stesso tempo molto performante; l'unica differenza che occorre tenere in considerazione è che lo scodamento non è detto che vada sempre a buon fine. E' per questo motivo che, invece del metodo Dequeue, si dispone della funzione TryDequeue.
ConcurrentQueue<string> users = new ConcurrentQueue<string>(); users.Enqueue("Ricciolo"); users.Enqueue(".db"); string nextUser; if (users.TryDequeue(out nextUser)) { // Faccio qualcosa con l'utente }
Poiché in situazione di concorrenza più thread possono scodare dalla coda, potrebbe non essere più disponibile un elemento, anche previa consultazione della proprietà Count. Per questo motivo è sempre opportuno affidarsi al boolean restituito da TryDequeue e TryPeek.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Creare gruppi di client per Event Grid MQTT
Eseguire attività pianificate con Azure Container Jobs
Evitare la script injection nelle GitHub Actions
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Utilizzare la libreria Benchmark.NET per misurare le performance
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Miglioramenti agli screen reader e al contrasto in Angular
Semplificare il deployment di siti statici con Azure Static Web App
Utilizzare la session affinity con Azure Container Apps
Eseguire una GroupBy per entity in Entity Framework
Ottimizzazione dei block template in Angular 17
I più letti di oggi
- Cambiare la chiave di partizionamento di Azure Cosmos DB
- ASP.NET 2.0 per tutti
- Definire stili a livello di libreria in Angular
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- .NET Conference Italia 2023 - Milano e Online
- Come EF 8 ha ottimizzato le query che usano il metodo Contains
- Ottimizzazione dei block template in Angular 17