Я уже посмотрел в StackOverflow, и на самый близкий мне вопрос был дан ответ 7 лет назад, и моя проблема не решилась.
MainControl.Children.Remove(ChildControl);
это удаляет ChildControl из списка дочерних элементов, но если я проверю память с помощью диагностических инструментов VS (а именно вкладки «Использование памяти»), я вижу, что объект все еще создается. Я думал, что GC позаботится об этом, но если я продолжу использовать приложение, количество экземпляров ChildControl, которые предположительно были удалены, не уменьшится.
Обновлено: я пишу отрывок из кода, который вызывает у меня эту проблему.
public partial class MainWindow : Window
{
public ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
// user control
MainGridUserControl mainGrid;
SelectionProcess selProcess;
ProcessManagerViewModel ProcessManagerContext;
/// <summary>
/// Switch main grid and selection process. True active main grid, false active selection process
/// </summary>
/// <param name = "openClose"></param>
public void SwitchMainGridSelectionProcess(bool openClose)
{
InfoLoginViewModel ilvm = (InfoLoginViewModel)SimpleIoc.Default.GetInstance<IInfoLoginViewModel>();
InfoLogin infoLogin = ilvm.ActualInfoLogin;
// if openClose true close selection process user control and open main grid user control
// else close main grid user contorllo and return to selection process user control
if (openClose)
{
MainWindowGrid.Children.Remove(selProcess);
SelectionProcessViewModel spvm = (SelectionProcessViewModel)selProcess.DataContext;
spvm.CloseCommand.Execute(null);
selProcess = null;
mainGrid = new MainGridUserControl(mwvm.LayoutMainGridTop, mwvm.ShowStationTree);
Grid.SetRow(mainGrid, MAINGRID_ROW);
if (this.FindName("MainWindowGrid") is null)
this.RegisterName("MainWindowGrid", mainGrid);
MainWindowGrid.Children.Add(mainGrid);
mwvm.SetOpenProcessToggleButtonCommand.Execute(null);
// set permission process user
mwvm.SetEnableButtonCommand.Execute(infoLogin.ProcessUser);
}
else
{
// if maiGrid null the open process failed. The old selProcess is already present
if (mainGrid != null)
{
if (!(this.FindName("MainWindowGrid") is null))
this.UnregisterName("MainWindowGrid");
MainWindowGrid.Children.Remove(mainGrid); // snapshot diagnostic tool shows this line has no effect on the number of instances of 'mainGrid'
mainGrid = null;
selProcess = new SelectionProcess();
Grid.SetRow(selProcess, MAINGRID_ROW);
MainWindowGrid.Children.Add(selProcess);
// set permission application user
mwvm.SetEnableButtonCommand.Execute(infoLogin.ApplicationUser);
}
}
}
}
@HenkHolterman Я должен сам написать метод удаления? Это не из тех, что предлагает intellisense.
@ V.Leon К сожалению, нет, я хотел бы проверить, является ли метод удаления (как ХенкХолтерман) заданием, а окна памяти просто не подходящим инструментом для использования в этом случае. Обновлено: Я понял, что не полностью ответил на ваш вопрос. Я не могу привести пример, так как кроме того, что я уже описал, ничего больше нет, это просто строка кода, которая, похоже, работает не так, как я предполагал.
Попробуйте GC.Collect (), если вы действительно хотите собрать всю память, как только объекты будут удалены, а это не так.
@ShivaniKatukota - нет, не звоните GC.Collect(). Так началось слишком много проблем.
@HenkHolterman, только если абсолютно необходимо освободить память, занятую этими удаленными объектами.
Честно говоря, я чувствовал, что это было бы излишеством, более того, это должен быть лучший способ решить такую простую задачу ... Я ошибаюсь, предполагая, что количество экземпляров должно уменьшиться, если я удалю childControl и перезапишу ссылку, указывающую на него?
@FabianoGaeta Да, элементы управления должны иметь право на сборку мусора, если не осталось ссылок. Могли бы предоставить пример кода? Я подозреваю, что что-то еще ссылается на элементы управления. Также не должно быть необходимости звонить в Dispose или GC.Collect().
Кроме того, создание снимка памяти с помощью средств профилирования / диагностики производительности вызовет сборку мусора (профилирование памяти / кучи основано на событиях, вызванных сборщиком мусора), поэтому нет необходимости делать это вручную.
@ V.Leon Я отредактировал свой вопрос кодом, с которым у меня возникли проблемы. Надеюсь, этого будет достаточно.





Вы можете предоставить нам Минимальный, полный и проверяемый пример?