Mam obiekt, który żyje wiecznie. Usuwam wszystkie odnośniki, które widzę, do niego po użyciu, ale nadal nie są gromadzone. Jego cykl życia jest dość skomplikowany, więc nie mogę być pewny, że wszystkie referencje zostały usunięte.Znajdź odniesienia do obiektu w czasie wykonywania
if (container.Controls.Count > 0)
{
var controls = new Control[ container.Controls.Count ];
container.Controls.CopyTo(controls, 0);
foreach (var control in controls)
{
container.Controls.Remove(control);
control.Dispose();
}
controls = null;
}
GC.Collect();
GC.Collect(1);
GC.Collect(2);
GC.Collect(3);
Jak mogę się dowiedzieć, jakie są jeszcze odniesienia? Dlaczego nie jest on gromadzony?
Pokaż nam swój kod, a być może będziemy mogli pomóc. Pamiętaj, że odśmiecanie niekoniecznie musi nastąpić natychmiast. – Lazarus
I domyślam się, że prawdziwe pytanie brzmi: dlaczego się o to martwisz? Jeśli korzystasz z zasobów jednorazowych, usuń je, gdy ich już nie używasz, usuwaj niezarządzane zasoby systemowe i uważaj, korzystając ze strun interwencyjnych. –
Kod jest: if (container.Controls.Count> 0) { \t \t \t \t sterujące var = Nowa kontrola [container.Controls.Count]; \t \t \t \t container.Controls.CopyTo (sterowanie, 0); \t \t \t \t foreach (regulowana zmienna w grupie kontrolnej) { \t \t \t \t \t container.Controls.Remove (próba kontrolna); \t \t \t \t \t control.Dispose(); \t \t \t \t \t \t \t \t \t} \t \t \t \t Kontrola = NULL; \t \t \t} GC.Collect(); GC.Collect (1); GC.Collect (2); GC.Collect (3); Ale wciąż jest w pamięci. Więc to znaczy, że stal ma korzenie. Jak mogę znaleźć te korzenie? –