在使用棱镜和MEF的Silverlight5应用程序中,NonShared对象有内存泄漏的问题,所以我尝试使用ExportFactory< T>来创建我的ViewModels,这应该是我所读到的解决方案。但是,在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();
}
}发布于 2013-03-21 06:37:52
Dispose不从内存中移除对象。这是垃圾收集器的工作。按照dispose模式,您可以释放非托管资源。
您在以下部分中所做的操作将导致问题:
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也将被释放。
https://stackoverflow.com/questions/15507282
复制相似问题