Estoy intentando actualizar las entradas en un ConcurrentDictionary algo como esto:campos de actualización de los valores de una ConcurrentDictionary
class Class1
{
public int Counter { get; set; }
}
class Test
{
private ConcurrentDictionary<int, Class1> dict =
new ConcurrentDictionary<int, Class1>();
public void TestIt()
{
foreach (var foo in dict)
{
foo.Value.Counter = foo.Value.Counter + 1; // Simplified example
}
}
}
Básicamente necesito para repetir el diccionario y actualizar un campo en cada valor. Entiendo por la documentación que necesito evitar el uso de la propiedad Value. En cambio, creo que necesito usar TryUpdate, excepto que no quiero reemplazar todo mi objeto. En cambio, quiero actualizar un campo en el objeto.
Después de leer this blog entry en el blog del equipo PFX: Quizás necesito usar AddOrUpdate y simplemente no hacer nada en el delegado de agregar.
¿Alguien tiene alguna idea de cómo hacer esto?
Tengo decenas de miles de objetos en el diccionario que necesito actualizar cada treinta segundos más o menos. Crear nuevos para actualizar la propiedad probablemente no sea factible. Tendría que clonar el objeto existente, actualizarlo y reemplazar el que está en el diccionario. También necesitaría bloquearlo durante la duración del ciclo de clonar/agregar. Yuck.
Lo que me gustaría hacer es iterar sobre los objetos y actualizar la propiedad del Contador directamente si es posible.
Mi última investigación me ha llevado a Parallel.ForEach, que suena muy bien pero no se supone que deba usarse para acciones que actualizan el estado.
También vi mención de Interlocked.Increment que suena genial, pero aún necesito descubrir cómo usarlo en cada elemento de mi diccionario de forma segura para hilos.
es que hay realmente ninguna concurrencia pasando Si sólo alguna vez actualiza un campo de cada valor cada 30 segundos? Suena como un diccionario normal y un ciclo foreach debería ser todo lo que necesita. Parallel.ForEach debería funcionar también, ya que no hay recursos compartidos. – dtb
Mientras se ejecuta el subproceso de actualización, se agregarán y eliminarán objetos adicionales del diccionario de otros subprocesos. Además, otras propiedades en el objeto se actualizarán a través de otros hilos en respuesta a los mensajes de WCF. Entonces sí, hay mucha concurrencia pasando. ¡Gracias por tu ayuda! – rboarman
De acuerdo. Entonces mi respuesta persiste. Use AddOrUpdate/GetOrAdd/TryUpdate, etc. para manipular los contenidos del diccionario; tomar una instantánea del diccionario al iterarlo; bloquear las instancias individuales de Class1 al cambiar sus propiedades. – dtb