Silverlight MEF ExportFactory <t>调用Dispose不会处理</t>

时间:2013-03-19 18:11:06

标签: silverlight prism mef

使用Prism和MEF在Silverlight 5应用程序中使用NonShared对象的内存泄漏问题因此尝试使用ExportFactory&lt; T>创建我的ViewModel,这应该是我读过的解决方案。但是,在ExportLifetimeContext上调用Dispose也不会从内存中删除对象。下面的代码创建了一个DataEntryViewModel的实例,但稍后调用两行处理ExportLifetimeContext没有任何效果。有什么建议吗?

[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();
    }

}

1 个答案:

答案 0 :(得分:0)

Dispose不会从内存中删除对象。那是垃圾收集器的工作。遵循dispose模式,您可以释放非托管资源。

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

var context = _ExportFactory.CreateExport();
DataContext = context.Value;
context.Dispose();

因为您要处置context,但在context.Value上保留对DataContext的引用。

ExportLifetimeContext.Dispose的文档中,它注意到:

  

使用完ExportLifetimeContext后调用Dispose。   Dispose方法使ExportLifetimeContext无法使用   州。调用Dispose后,必须释放所有引用   ExportLifetimeContext使垃圾回收器可以回收   ExportLifetimeContext占用的内存。

您可以执行的操作是覆盖DataEntry类中的Component.Dispose(bool)并在其中调用context.Dispose。因此,当处置UserControl时,ExportLifetimeContext也将被处置。