2008-10-28 14 views
5

Podczas badania wycieku pamięci odkryłem, że było to spowodowane wielokrotnym wywołaniem funkcji NewRow() w tabeli wewnątrz pętli. Jednak utworzony DataRow nigdy nie został dodany do kolekcji TableRows, a liczba wierszy tabeli nigdy nie przekroczyła zera.Tabela NewRow() powoduje wyciek pamięci

Moje pytanie brzmi: dlaczego to powoduje zwiększenie ilości pamięci za każdym razem, gdy wywoływana jest funkcja NewRow, nawet jeśli nowo utworzona DataRow nigdy nie zostanie dodana do kolekcji Wiersze, a DataRow zwrócona przez NewRow jest zawsze przypisana do tej samej zmiennej lokalnej (co powoduje, że odrzuca ostatni nowy wiersz).

Proszę zignorować problem, dlaczego kod tworzy dane, które nie zostaną dodane do tabeli!

Odpowiedz

5

DataRow dziedziczy schematu z DataTable, więc są referencje od DataRow do schematu tabeli, który wygenerował wiersz. Nowy wiersz znajduje się w stanie Wolnostojący w tabeli.
dlatego właśnie GC pozostawił nowe, nieużywane wiersze sam.

1

Myślę, że twoje dwa problemy są ze sobą powiązane.

Table.NewRow tworzy nowy wiersz danych, który ma taki sam format kolumny jak początkowa tabela.

Ten nowy wiersz należy dodać do tabeli za pomocą table.Rows.Add (newRow). Twoja pętla będzie tworzyć obiekty, które nigdy nie są używane, a tym samym zjedzą pamięć. Zobacz ten artykuł, aby uzyskać więcej informacji http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx

+0

Cześć Stephen, Rozumiem to, po prostu nie jestem pewien, dlaczego używa pamięci, gdy rząd nie jest nigdy używany. Sądzę, że szukałem głębiej informacji o tym, co dzieje się za kulisami w DataTable. –

4

DataTable.NewRow() dodaje utworzony wiersz do RecordManager DataTable. Nie jestem do końca pewien, dlaczego tak się dzieje, ale dlatego nie jest on uwalniany przez GC.

Wydaje się, że istnieją tylko dwa sposoby, aby pozbyć się DataRow:

  1. dodać go do stołu, a następnie usunąć.
  2. Wywołanie DataTable.Clear().