0

在使用 Prism 和 MEF 的 Silverlight 5 应用程序中,NonShared 对象存在内存泄漏问题,因此尝试使用 ExportFactory< T > 创建我的 ViewModels,这应该是我所读到的解决方案。但是,在 ExportLifetimeContext 上调用 Dispose 也不会从内存中删除对象。下面的代码创建了一个 DataEntryViewModel 的实例,但在两行之后调用 dispose 的 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();
    }

}
4

1 回答 1

0

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

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

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

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

ExportLifetimeContext.Dispose的文档中指出:

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

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

于 2013-03-20T22:37:52.423 回答