c# - 从 ContentControl 中使用的 Ioc 的 viewModel 中释放内存

标签 c# wpf mvvm mvvm-light ioc-container

我目前正在使用 ContentControl 通过设置 VM 和使用默认数据模板来显示我的 View :

<UserControl.Resources>
    <DataTemplate DataType="{x:Type vm:MyViewViewModel}">
        <views:MyView />
    </DataTemplate>
</UserControl.Resources>
<ContentControl Content="{Binding ContainerContent}"/>

这是我的容器内容:

public ViewModelBase ContainerContent
{
    get
    {
        return _containerContent;
    }
    set
    {
        if (_containerContent != null)
            _containerContent.Cleanup();

        _containerContent = value;
        RaisePropertyChanged("ContainerContent");
    }
}

我目前使用 SimpleIoc 通过 serviceLocator 加载 ViewModel:

ContainerContent = ServiceLocator.Current.GetInstance<MyViewViewModel>();

这很好用,可以正确显示我的 View ,并将 viewModel 分配给内容。

不幸的是,当我想从我的 ContentControl 中删除 View (和 View 模型)时,由于 ViewModel、View 和 SimpleIoc 之间的释放顺序,我的内存仍在使用。 View 曾引用它一段时间(我认为这个时间是由于容器上的 RaisePropertyCHange 之后的绑定(bind))

我目前使用一种方法来删除内容:

 public void QuitCurrentContainerViewModel<T>() where T : class
        {
            ContainerContent = null;
            Task.Factory.StartNew(() =>
            {
                if (/*!*/SimpleIoc.Default.ContainsCreated<T>())
                {
                    SimpleIoc.Default.Unregister<T>();
                }
                DispatcherHelper.RunAsync(() =>
                {
                    MessageBox.Show("Do GC now");
                    GC.Collect();

                }, DispatcherPriority.ApplicationIdle);
            });
        }

(使用dispatcher和priority是测试)

如果我调用它,有时我的内存会被正确释放,但并非总是如此。

在任何情况下,如果我从快捷方式强制执行 GC.Collect,我的内存都会得到正确管理。

在我的案例中释放内存的好方法是什么?

谢谢!

编辑:我的错,它与该代码一起工作正常(在我使用此检查的 QuitCurrentContainerViewModel 方法中:

if (!SimpleIoc.Default.ContainsCreated<T>())

但我需要这个:

if (SimpleIoc.Default.ContainsCreated<T>())

这样看起来效果不错。

最佳答案

What is the good way to release the memory in my case ?

使用 IDisposable每个对象的模式,并在泛型类型说明符中要求它。这样一来,可以直接调用顶级实体,随后可以清除所有遵循接口(interface)的子引用。

请记住,具有订阅的实例,尽管该实例未在代码中直接引用,但如果它们具有任何事件的订阅,则会成为固定并保持事件状态;让垃圾收集器远离。

在实例可以被垃圾回收之前,必须取消所有订阅。

If I call this sometimes my memory is correctly freed, but not always.

您是否正在查看应用程序的私有(private)字节?对于操作系统报告完整的总数,如果操作系统没有压力,它不会带走内存占用,可以让应用程序呼吸。专用字节将在完整分配的总数中上下波动。

因此您可能正在监控错误的值。

关于c# - 从 ContentControl 中使用的 Ioc 的 viewModel 中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947302/

相关文章:

c# - getById 函数在存储库模式中获取一个或多个键

c# - WPF 更改边距将其他元素向下推

c# - Xamarin.Forms Picker ItemsSource在XAML中保持为空

c# - 无法处理消息,因为内容类型 'application/json; charset=utf-8' 不是预期的类型 'text/xml; charset=utf-8'

c# - 是否有一个库可以在 Windows Mobile 上用 C# 读取 JSON?

c# - 在 WCF 中使用共享数据类型作为 DataContract

WPF Prism - 使用 Prism 区域有什么意义?

c++ - 带拖放的 UIAccess

silverlight - 在文本框中输入百分比将值乘以100

model-view-controller - 业务逻辑是存在于模型中还是存在于 Controller 中?