# 1:
El método más simple y menos eficiente es la creación de una sección crítica para los lectores y escritores.
// Writer
lock (aList)
{
aList.Remove(item);
}
// Reader
lock (aList)
{
foreach (T name in aList)
{
name.doSomething();
}
}
Método # 2:
Esto es similar al método # 1, pero en lugar de mantener el bloqueo durante toda la duración del bucle foreach
que sería copiar la colección primero y luego iterar sobre la dupdo. Método
// Writer
lock (aList)
{
aList.Remove(item);
}
// Reader
List<T> copy;
lock (aList)
{
copy = new List<T>(aList);
}
foreach (T name in copy)
{
name.doSomething();
}
# 3:
Todo depende de su situación específica, pero la forma en que normalmente se utiliza esto es mantener la referencia principal a la colección inmutable. De esta forma, nunca tendrá que sincronizar el acceso en el lado del lector. El lado del escritor de las cosas necesita un lock
. El lado del lector no necesita nada, lo que significa que los lectores se mantienen altamente concurrentes. Lo único que debe hacer es marcar la referencia aList
como volatile
.
// Variable declaration
object lockref = new object();
volatile List<T> aList = new List<T>();
// Writer
lock (lockref)
{
var copy = new List<T>(aList);
copy.Remove(item);
aList = copy;
}
// Reader
List<T> local = aList;
foreach (T name in local)
{
name.doSomething();
}
Gracias, funciona como un encanto :) Esperemos que no voy a tener ningún problema de rendimiento mediante el uso de eso .. –