使用Prism和MEF在Silverlight 5应用程序中使用NonShared对象的内存泄漏问题因此尝试使用ExportFactory< 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();
}
}
答案 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
也将被处置。