c# generics - considerazioni

C# Generics – Considerazioni

Nei precedenti post sono stati introdotte alcune interfacce presenti all’interno di System.Collections, che possono essere implementate per funzionalità specifiche come la gestione di liste, dictionary e set.

L’utilizzo di queste interfacce specializzate e delle loro relative implementazioni ha la particolarità di non essere thread-safe: tutto questo si traduce nella possibilità di poter effettuare accessi in lettura contemporanemente (anche se non sempre è possibile) e nell’impossibilità di effettuare operazioni di scrittura con attività concorrenti.

Per poter effettuare modifiche contemporaneamente è necessario impostare un meccanismo che garantisca la sincronizzazione degli accessi. Uno dei meccanismi più semplici da implementare è l’utilizzo di lock(…) che consente di ottenere l’accesso esclusivo ad una risorsa , eseguirne un blocco di istruzioni e rilasciarla al termine dell’esecuzione.

Eventuali tentativi di accedere alla risorsa da parte di altri thread verrebbero bloccati. Sebbene questo tipo di approccio sia corretto e funzionale, non è sicuramente quello ottimale.

Nel caso in cui si renda necessaria la lettura concorrente degli elementi della collection, sarebbe opportuno utilizzare accessi concorrenti che consentano di migliorare le performance .

All’interno della BCL (Base Class Library) è presente la classe ReaderWriterLockSlim che consente di gestire gli accessi in maniera semplice garantendo alte performance: la classe consente di effettuare infiniti accessi concorrenti in lettura, mentre le scritture sono esclusive e non permettono letture o altre scritture contemporaneamente.

System.Collections.Concurrent

Systems.Collections.Concurrent contiene al suo interno una serie di implementazioni delle interfacce generiche che consentono di gestire il parallellismo e operazioni concorrenti.

Le classi presenti all’intero di System.Collections.Concurrent possono essere ulizzate all’interno di applicazioni multi-thread. L’accesso multi-thread è garantito tramite l’implementazione di interfacce extra che consentono la gestione thead-safe.

Ad esempio la classe ConcurrentDictionary<TKey, TValue> includono funzionalità extra come GetOrAdd and AddOrUpdate che non sono propriamente full-atomic, accettando un delegato come parametro e richiamato al di fuori delle chiamate legate al lock.

Immutable Collections

Le Immutable Collections non fanno parte della BCL, ma devono essere importate separatamente attraverso nuget. La logica di funzionamento per la gestione thread-safe utilizza un approccio differente: la collection non può essere modificata, una volta creata. Questo tipo di approccio rende la collection implicitamente thread safe, non consento ad altri thread di scrivere gli elementi nella collection, evitando eventuali inconsistenze.

La particolarità di queste Collections è quella di non avere un costruttore e di poter essere create tramite l’extension method .ToImmutable() oppure tramite il metodo Add dell’oggetto ImmutableList<T>.

Ogni operazione che comporta la modifica degli elementi di una Immutable Collection genera una nuova istanza: ad esempio utilizando il metodo Add(…) viene ritornata una nuova lista con l’aggiunta dell’elemento appena inserito.

Pubblicato da

Andrea Merlin

Laureato in informatica, diversi corsi di specializzazione legati allo Sviluppo Software e alla Computer forensics. Appassionato di nuove tecnologie, amo la programmazione, la Business Intelligence e tematiche legate alla Privacy.Sempre alla ricerca di nuove idee, stimoli … e progetti da seguire!Amo trascorrere il tempo libero in Val Borbera, un piccolo angolo del Piemonte, in provincia di Alessandria.