Question

Tout en enquêtant sur une fuite de mémoire, j’ai découvert qu’elle était causée par l’appel de NewRow () sur une table dans une boucle plusieurs fois. Toutefois, le DataRow créé n'a jamais été ajouté à la collection Table Rows et le nombre de lignes de la table n'a jamais été supérieur à zéro.

Ma question est la suivante: pourquoi utilise-t-il toujours plus de mémoire chaque fois que NewRow est appelé alors que le DataRow nouvellement créé n’a jamais été ajouté à la collection Rows et que le DataRow renvoyé par NewRow est toujours affecté à la même variable locale (par conséquent, le dernière nouvelle ligne).

Ignorez le problème qui explique pourquoi le code crée des DataRows qui ne sont pas ajoutés à la table!

Était-ce utile?

La solution

DataRow hérite du schéma du DataTable. Il existe donc des références de DataRow au schéma de table qui a généré la ligne. La nouvelle ligne est à l'état Détaché dans la table.
C'est pourquoi GC a laissé les nouvelles lignes inutilisées.

Autres conseils

DataTable.NewRow () ajoute la ligne créée au RecordManager du DataTable. Je ne suis pas tout à fait sûr de savoir pourquoi cela se produit, mais c’est pourquoi il n’est pas libéré par le gouvernement.

Il semble qu'il n'y ait que deux façons de se débarrasser de DataRow:

  1. Ajoutez-le à la table, puis supprimez-le.
  2. Appelez DataTable.Clear ().

Je pense que vos deux problèmes sont liés.

Table.NewRow crée une nouvelle ligne de données au même format de colonne que la table initiale.

Cette nouvelle ligne doit être ajoutée à la table à l'aide de table.Rows.Add (newRow). Votre boucle créera des objets qui ne seront jamais utilisés et consommeront donc de la mémoire. Voir cet article pour plus d'informations http://msdn.microsoft.com/en- us / library / system.data.datatable.newrow.aspx

Si vous créez newRow = table.NewRow () puis, dans le code ci-dessous, décidez que ce newRow ne vous est plus nécessaire. 1) Ajouter si rangée dans la table. 2) Supprimez, cela évitera les fuites de mémoire.

    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);//
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top