Domanda

Mentre studiavo una perdita di memoria ho scoperto che era causato chiamando molte volte NewRow () su una tabella all'interno di un ciclo. Tuttavia, il DataRow creato non è mai stato aggiunto alla raccolta Table Rows e il conteggio delle righe della tabella non ha mai superato lo zero.

La mia domanda è perché questo utilizza più memoria ogni volta che viene chiamato NewRow anche se il DataRow appena creato non viene mai aggiunto alla raccolta Rows e il DataRow restituito da NewRow viene sempre assegnato alla stessa variabile locale (quindi apparentemente scartando ultima nuova riga).

Ignora il motivo per cui il codice sta creando DataRows che non vengono aggiunti alla tabella!

È stato utile?

Soluzione

DataRow eredita lo schema dalla DataTable, quindi ci sono riferimenti da DataRow allo schema della tabella che ha generato la riga. La nuova riga è nello stato Detached nella tabella.
questo è il motivo per cui GC ha lasciato solo le nuove righe inutilizzate.

Altri suggerimenti

DataTable.NewRow () aggiunge la riga creata al RecordManager di DataTable. Non sono del tutto sicuro del perché questo accada, ma è per questo che non viene liberato dal GC.

Sembra che ci siano solo due modi per sbarazzarsi di DataRow:

  1. Aggiungilo alla tabella, quindi eliminalo.
  2. Chiama DataTable.Clear ().

Penso che i tuoi due problemi siano correlati.

Table.NewRow crea una nuova riga di dati con lo stesso formato di colonna della tabella iniziale.

Questa nuova riga deve essere aggiunta alla tabella usando table.Rows.Add (newRow). Il tuo loop creerà oggetti che non vengono mai utilizzati e quindi consumerà memoria. Vedi questo articolo per maggiori informazioni http://msdn.microsoft.com/en- us / library / system.data.datatable.newrow.aspx

Se crei newRow = table.NewRow () e poi nel codice qui sotto decidi di questo newRow non avrai più bisogno. 1) Aggiungi se riga nella tabella. 2) Rimuovi, impedirà la perdita di 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);//
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top