Pregunta

Mientras investigaba una pérdida de memoria, descubrí que era causada por llamar a NewRow () en una tabla dentro de un bucle muchas veces. Sin embargo, el DataRow creado nunca se agregó a la colección de filas de la tabla y el conteo de filas de la tabla nunca llegó a ser superior a cero.

Mi pregunta es por qué esto consume más memoria cada vez que se llama NewRow, a pesar de que el DataRow recién creado nunca se agrega a la colección Rows y el DataRow devuelto desde NewRow siempre se asigna a la misma variable local (por lo tanto, aparentemente se descarta el última fila nueva).

¡Ignora el problema de por qué el código crea DataRows que no se agregan a la tabla!

¿Fue útil?

Solución

DataRow hereda el esquema de DataTable, por lo que hay referencias de DataRow al esquema de tabla que generó la fila. La nueva fila está en estado Desconectado en la tabla.
esta es la razón por la que GC dejó las nuevas filas sin usar solo.

Otros consejos

DataTable.NewRow () agrega la fila creada al RecordManager del DataTable. No estoy completamente seguro de por qué sucede esto, pero es por eso que no está liberado por el GC.

Parece que solo hay dos formas de deshacerse de DataRow:

  1. Agrégalo a la tabla y luego bórralo.
  2. Llame a DataTable.Clear ().

Creo que sus dos problemas están relacionados.

Table.NewRow crea una nueva fila de datos que tiene el mismo formato de columna que la tabla inicial.

Esta nueva fila debe agregarse a la tabla usando table.Rows.Add (newRow). Su bucle creará objetos que nunca se usan y por lo tanto consumirán memoria. Vea este artículo para más información. http://msdn.microsoft.com/en- us / library / system.data.datatable.newrow.aspx

Si crea newRow = table.NewRow () y luego en el siguiente código, decida que este newRow no necesita más. 1) Añadir si la fila en la tabla. 2) Eliminar, evitará la pérdida de memoria.

    var table = new DataTable();
    while (true)
    {
        var newRow = table.NewRow();
        table.Rows.Add(newRow);   //Without this 2 rows you will have memory leak.
        table.Rows.Remove(newRow);//
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top