Foros del Web » Programación para mayores de 30 ;) » .NET »

Problema con ArrayList compartido por dos procesos

Estas en el tema de Problema con ArrayList compartido por dos procesos en el foro de .NET en Foros del Web. Hola! Tengo un problema con un ArrayList que comparten dos procesos. Lo que hago es leer datos de un puerto serie y los voy almacenando ...
  #1 (permalink)  
Antiguo 15/04/2013, 09:11
Avatar de JOvelleiro  
Fecha de Ingreso: febrero-2012
Ubicación: Valladolid
Mensajes: 25
Antigüedad: 12 años, 1 mes
Puntos: 0
Problema con ArrayList compartido por dos procesos

Hola!

Tengo un problema con un ArrayList que comparten dos procesos.

Lo que hago es leer datos de un puerto serie y los voy almacenando en un ArrayList para luego tratarlos.

Al crear el SerialPort indico SerialDataReceivedEventHandler en el que voy almacenando los datos leídos mientras que en otro hilo voy mirando si hay datos en ese ArrayList para analizarlos y almacenarlos en una DDBB.

serialport = new SerialPort();
serialport.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataRece ived);

El problema es que cuando en este subproceso distinto al del EventHandler voy tratando los datos, me sale el siguiente error dado que mientras trabajaba con él se habían añadido nuevos datos: "Colección modificada; puede que no se ejecute la operación de enumeración."

Espero alguien me pueda echar una mano.

Un saludo!!!
  #2 (permalink)  
Antiguo 15/04/2013, 09:59
 
Fecha de Ingreso: abril-2013
Mensajes: 5
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problema con ArrayList compartido por dos procesos

A priori no puedes "borrar" elementos de un ArrayList si éste lo estás modificando desde otro proceso.

Deberías usar una FIFO (queue) en lugar de un ArrayList.
  #3 (permalink)  
Antiguo 17/04/2013, 02:25
Avatar de JOvelleiro  
Fecha de Ingreso: febrero-2012
Ubicación: Valladolid
Mensajes: 25
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Problema con ArrayList compartido por dos procesos

Gracias KernelENREK.

He estado buscando información sobre el manejo de este tipo de listas y sigo teniendo la duda de que se puedan añadir y eliminar elementos a una lista en distintos procesos. La solución más inmediata que se me ha ocurrido es copiar el contenido de la lista en la que el proceso del SerialPort almacena los datos en otra para poder analizarlos.

El problema es que si se copia una lista en otra mediante "List<String> Lista2 = Lista1;" lo que se copia es la dirección de memoria de Lista1 a Lista2, no el contenido de ella, por lo que cualquier modificación en Lista2 afectará a Lista1, así que el problema sigue siendo el mismo...

¿Alguna idea?
  #4 (permalink)  
Antiguo 17/04/2013, 14:03
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 12 años, 10 meses
Puntos: 344
Respuesta: Problema con ArrayList compartido por dos procesos

Buenas,

Para estos casos se tiene que usar el bloqueo (lock) o una colección que ya esté sincronizada y además, no se deben usar enumeradores cuando se acceda desde varios procesos porque te devuelve el error que indicas.

Creo que te sería muy util la clase ConcurrentQueue: http://msdn.microsoft.com/es-es/library/dd267265.aspx

La clase ConcurrentQueue es una cola FIFO donde vas introduciendo valores y puedes obtenerlos desde otro sitio y como está sincronizada, no vas a tener problemas con los hilos.

Mírate también este enlace por si te sirve:
http://msdn.microsoft.com/es-es/library/dd997305.aspx

Saludos.

Etiquetas: arraylist, compartido, procesos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:45.