Frage

Während ein Speicherleck Untersuchung entdeckte ich, dass es durch den Aufruf NewRow () auf einem Tisch in einer Schleife viele Male verursacht wurde. Doch die DataRow erstellt wurde nie auf die Tabellenzeilen Sammlung hinzugefügt und die Tabellenzeilen nie über Null bekam Graf.

Meine Frage ist, warum dieses aufbrauchen nicht mehr Speicher NewRow jedes Mal noch nie in die Reihen Sammlung hinzugefügt wird, obwohl die neu geschaffene DataRow aufgerufen wird und die DataRow von NewRow zurück immer mit den gleichen lokalen Variablen zugewiesen wird (dadurch offenbar verworfen die letzte neue Zeile).

Bitte ignorieren Sie die Frage, warum der Code DataRows schafft, die auf dem Tisch werden nicht hinzugefügt!

War es hilfreich?

Lösung

DataRow erbt Schema aus der Datentabelle, so gibt es Hinweise von DataRow mit dem Tabellenschema, das die Zeile erzeugt. Die neue Zeile ist in abgenommenen Zustand in der Tabelle.
aus diesem Grund GC die neuen nicht verwendeten Zeilen allein gelassen.

Andere Tipps

DataTable.NewRow () fügt die erstellte Zeile der Datatable des RecordManager. Ich bin nicht ganz sicher, warum dies geschieht, aber das ist, warum es nicht von der GC befreit wird.

Es scheint, dass es nur zwei Möglichkeiten des DataRow loszuwerden:

  1. Fügen Sie es auf den Tisch, dann löschen.
  2. Rufen Sie DataTable.Clear ().

Ich denke, Ihre beiden Fragen in Zusammenhang stehen.

Table.NewRow erzeugt eine neue Datenzeile, die das gleiche Spaltenformat wie die Anfangstabelle hat.

Diese neue Zeile muss die Tabelle hinzugefügt wird unter Verwendung von table.Rows.Add (newRow). Ihre Schleifen Objekte erschaffen, die nie benutzt werden und somit Speicher wird auffressen. Lesen Sie diesen Artikel für weitere Informationen http://msdn.microsoft.com/en- us / library / system.data.datatable.newrow.aspx

Wenn Sie erstellen newRow = table.NewRow () und dann in dem folgenden Code entscheiden, als diese newRow Sie mehr nicht brauchen. 1) hinzufügen, wenn Zeile in der Tabelle. 2) Entfernen Sie, wird es Speicherverlust verhindern.

    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);//
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top