Condividi tramite


Insiemi e sincronizzazione (thread-safe)

Aggiornamento: novembre 2007

Per impostazione predefinita, le classi in System.Collections e negli spazi dei nomi correlati non sono thread-safe. Più lettori possono leggere l'insieme in tutta sicurezza. Tuttavia, qualsiasi modifica all'insieme produce risultati non definiti per tutti i thread che accedono all'insieme, compresi i thread di lettura.

È possibile rendere thread-safe le classi di System.Collections in uno dei seguenti modi:

  • Creare un wrapper thread-safe utilizzando il metodo Synchronized e accedere all'insieme esclusivamente attraverso il wrapper.

  • Se la classe non è dotata di un metodo Synchronized, derivarlo dalla classe e implementare un metodo Synchronized utilizzando la proprietà SyncRoot.

  • Utilizzare un meccanismo di blocco, ad esempio l'istruzione lock in C# (SyncLock in Visual Basic o la classe Monitor in C++), sulla proprietà SyncRoot quando si accede all'insieme.

Durante l'implementazione del metodo Synchronized, le classi derivate devono eseguire l'override della proprietà IsReadOnly affinché venga restituito il valore corretto.

La classe Array non include un metodo Synchronized e, benché disponga di una proprietà SyncRoot, non può essere derivata. Di conseguenza, una matrice può essere resa thread-safe solo attraverso il meccanismo di blocco.

Le classi di insiemi generici non includono membri di sincronizzazione. Tuttavia, alcune classi generiche, quali Collection<T>, Dictionary<TKey, TValue> e List<T>, implementano in modo esplicito i membri di sincronizzazione ereditati dall'interfaccia non generica ICollection.

Vedere anche

Riferimenti

System.Collections

System.Collections.Specialized

System.Collections.Generic

Altre risorse

Creazione e modifica degli insiemi