Lista compartida entre diferentes hilos en .NET

Tengo una lista estática en una clase a la que se accederá mediante subprocesos diferentes, cada uno agregando, leyendo y eliminando su propio elemento único de la lista. Me gustaría saber si tengo que preocuparme por hacer seguro este subproceso variable, ya que aunque el mismo objeto de lista se comparte entre los subprocesos, solo modifican sus propios elementos únicos.

Definitivamente, tiene que implementar un acceso seguro para subprocesos ya sea mediante locking o mediante, por ejemplo, ReaderWriterLockSlim .

La variable en sí misma (Lista <>) es segura para subprocesos si no la modifica después de la primera asignación (a través de la nueva), pero el acceso a los elementos debe ser seguro para las hebras (ya que dice que agrega / elimina elementos de la lista, por lo tanto, cambia su estado)

Por cierto, si los hilos modifican sus propios elementos, ¿por qué quieres compartirlos? Entonces, ¿qué has implementado? ¿Por qué te organizas de esta manera? Tal vez hay un mejor consejo si muestra detalles.

Si sus hilos no comparten los datos de ninguna manera, entonces ¿por qué compiten por acceder a la misma lista? Esto podría ser un uso aceptable del patrón de almacenamiento local del hilo . .NET ofrece los siguientes mecanismos.

  • Thread.SetData y Thread.GetData
  • ThreadStaticAttribute

O quizás si podría abstraer los hilos en sus propias instancias individuales de una clase personalizada y luego usar variables de instancia en lugar de una variable de lista estática.

Solo debe preocuparse cuando cambie la lista (agregar / eliminar). Sin embargo, si está utilizando el objeto que acaba de obtener / agregar, entonces no debe preocuparse (a menos que deba usarse en varios subprocesos)

 static List _clientStates; static readonly Object _clientStatesLock = new Object(); /// Gets the state of a client for a given Id. /// Returns null if no state exists. /// This method is threadsafe. ClientState GetState (ClientIdentifier id){ lock (_clientStatesLock) return _clientStates.FirstOrDefault (cs => cs.Id == id); } 

Lo mismo ocurre con la adición / eliminación de elementos.

Si está en .NET 4, use las colecciones concurrentes proporcionadas siempre que sea posible en lugar de implementar las suyas propias.

Consulte http://msdn.microsoft.com/en-us/library/dd997305.aspx