In scenari multi-thread, si noti che le raccolte di sola lettura non sono ancora thread-safe.
Dalla documentazione ReadOnlyCollection<T>
:
... se vengono apportate modifiche alla raccolta sottostante, la collezione di sola lettura riflette questi cambiamenti
Dal collezioni, come List<T>
e altri, sono non thread-safe, quindi non è la raccolta di sola lettura.
Importante: ci sono alcuni casi d'angolo che non troverete esplicitamente spiegato in MSDN. Alcune delle operazioni che apparentemente leggono solo il contenuto di una raccolta, stanno infatti modificando le strutture interne della raccolta. Perché questo non è specificato? - Una ragione ovvia è perché si tratta di un dettaglio di implementazione che non riflette sull'API. Il risultato è che anche se non si modifica List<T>
avvolto in un ReadOnlyCollection<T>
e si utilizzano solo getter, l'arresto anomalo potrebbe ancora verificarsi in ambiente a più thread!
La linea di fondo è che le raccolte comuni, anche se racchiuse in un ReadOnlyCollection
non possono essere utilizzate in ambienti multi-threaded fuori dalla scatola.
Diversamente da ReadOnlyCollection
, le raccolte non modificabili garantiscono che nessuna delle strutture interne cambierà mai dopo aver ottenuto un riferimento a una raccolta. Nota che queste strutture non sono ancora veramente immutabili. Sono, invece, freezable. Ciò significa che la struttura cambierà internamente per un po 'finché non sarà congelata e restituita al chiamante. Oltre quel punto, tutte le altre chiamate sulla collezione immutabile effettueranno solo modifiche al di fuori delle strutture accessibili attraverso il riferimento originale.
Conclusione: le raccolte di sola lettura sono non thread-safe; le collezioni immutabili sono thread-safe.
fonte
2018-03-02 10:20:28
Questo post sembra spiegarlo abbastanza bene "http://blog.slaks.net/2013-06-11/readonly-vs-immutable/" – Damian
Solo per l'infomration 'System.Collections.Immutable' deve essere installato tramite il gestore di pacchetti nuget. Ho dovuto farlo in un progetto di targeting. NET Framework 4.6.2. – RBT