Pergunta

Enquanto investigando um vazamento de memória, descobri que ele foi causado por chamar NewRow () em uma tabela dentro de um loop muitas vezes. No entanto, o DataRow criado nunca mais foi adicionado à coleção de linhas da tabela e as linhas da tabela Nunca conte ficou acima de zero.

A minha pergunta é por que este uso mais memória cada vez NewRow é chamado, embora o DataRow recém-criado nunca é adicionado à coleção de linhas e o DataRow retornado de NewRow é sempre atribuído à mesma variável local (assim, aparentemente descartando a última nova linha).

Por favor, ignore a questão de por que o código está criando DataRows que não são adicionados à tabela!

Foi útil?

Solução

DataRow herda esquema do DataTable, por isso há referências de DataRow para o esquema da tabela que gerou a linha. A nova linha está em estado destacado na tabela.
é por isso que GC deixou as novas linhas não utilizadas sozinho.

Outras dicas

DataTable.NewRow () adiciona a linha criada para RecordManager do DataTable. Não estou inteiramente certo por que isso acontece, mas é por isso que não é liberado pela GC.

Parece que existem apenas duas maneiras de se livrar do DataRow:

  1. Adicionar à mesa, em seguida, excluí-lo.
  2. Chamada DataTable.Clear ().

Eu acho que suas duas questões estão relacionadas.

Table.NewRow cria uma nova linha de dados que tem o mesmo formato de coluna, como a tabela inicial.

Esta nova linha deve ser adicionada à tabela usando table.Rows.Add (newRow). Seu laço será a criação de objetos que nunca são usados ??e, portanto, vai comer a memória. Consulte este artigo para obter mais informações http://msdn.microsoft.com/en- us / library / system.data.datatable.newrow.aspx

Se você criar newRow = table.NewRow () e, em seguida, no código abaixo decidir que isso newRow lo mais não precisa. 1) Adicione se linha na tabela. 2) Remova, vai evitar vazamento de memória.

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top