首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Dispose的Silverlight MEF ExportFactory<T>调用未进行Dispose

对Dispose的Silverlight MEF ExportFactory<T>调用未进行Dispose
EN

Stack Overflow用户
提问于 2013-03-20 02:11:06
回答 1查看 283关注 0票数 0

在使用棱镜和MEF的Silverlight5应用程序中,NonShared对象有内存泄漏的问题,所以我尝试使用ExportFactory< T>来创建我的ViewModels,这应该是我所读到的解决方案。但是,在ExportLifetimeContext上调用Dispose也不会从内存中删除对象。下面的代码创建了一个DataEntryViewModel实例,但是两行之后处理该ExportLifetimeContext的调用没有任何效果。有什么建议吗?

代码语言:javascript
复制
[Export("DataEntry", typeof(UserControl)), PartCreationPolicy(CreationPolicy.NonShared)]
public partial class DataEntry
{
    private readonly ExportFactory<DataEntryViewModel> _ExportFactory;
    [ImportingConstructor]
    public DataEntry(ExportFactory<DataEntryViewModel> exportFactory)
    {
        _ExportFactory = exportFactory;
        var context = _ExportFactory.CreateExport();
        DataContext = context.Value;
        context.Dispose();
        InitializeComponent();
    }

}
EN

回答 1

Stack Overflow用户

发布于 2013-03-21 06:37:52

Dispose不从内存中移除对象。这是垃圾收集器的工作。按照dispose模式,您可以释放非托管资源。

您在以下部分中所做的操作将导致问题:

代码语言:javascript
复制
var context = _ExportFactory.CreateExport();
DataContext = context.Value;
context.Dispose();

因为您正在处理context,但在DataContext上保留了对context.Value的引用。

ExportLifetimeContext.Dispose的文档中是否提到:

使用完ExportLifetimeContext后,调用

Dispose。Dispose方法使ExportLifetimeContext处于不可用状态。调用Dispose之后,必须释放对ExportLifetimeContext的所有引用,以便垃圾回收器可以回收ExportLifetimeContext占用的内存。

您可以做的是覆盖DataEntry类中的Component.Dispose(bool),并在其中调用context.Dispose。因此,当UserControl被释放时,ExportLifetimeContext也将被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15507282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档