2008-10-28 13 views
5

Mientras investigaba una pérdida de memoria, descubrí que se debía a que llamaba NewRow() en una tabla dentro de un bucle varias veces. Sin embargo, el DataRow creado nunca se agregó a la colección de filas de tabla y el recuento de filas de tabla nunca pasó de cero.Table NewRow() Causa pérdida de memoria

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

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

Respuesta

5

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

1

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 utilizando table.Rows.Add (newRow). Su bucle creará objetos que nunca se usan y, por lo tanto, se comerán la memoria. Consulta este artículo para obtener más información http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx

+0

Hola Stephen, entiendo eso, no estoy seguro de por qué usa memoria cuando la fila nunca se usa. Supongo que estaba buscando información más profunda sobre lo que sucede detrás de escena en DataTable. –

4

DataTable.NewRow() agrega la fila creada al RecordManager de DataTable. No estoy del todo seguro de por qué sucede esto, pero esta es la razón por la cual no es liberado por el CG.

Parece que sólo hay dos maneras de deshacerse de la DataRow:

  1. añadirlo a la tabla, a continuación, elimínelo.
  2. Llamar DataTable.Clear().