2013-03-19 41 views
0

在使用Prism和MEF的Silverlight 5應用程序中使用NonShared對象發生內存泄漏問題,因此試圖使用ExportFactory T>創建我的ViewModels,這應該是一個解決方案從我讀過的。但是,在ExportLifetimeContext上調用Dispose不會從內存中刪除對象。以下代碼創建DataEntryViewModel的一個實例,但稍後處理ExportLifetimeContext兩行的調用不起作用。有什麼建議麼?Silverlight MEF ExportFactory <T>調用Dispose不處理

[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

Dispose不會從內存中刪除對象。這是垃圾收集器的工作。在處理模式之後,您可以釋放非託管資源。

您在下面的部分是做什麼會導致問題:

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

,因爲你要丟棄context但保持對它的引用context.ValueDataContext

ExportLifetimeContext.Dispose的文檔就指出,:

調用Dispose當您使用ExportLifetimeContext完成。 Dispose方法將ExportLifetimeContext保留爲不可用的 狀態。在調用Dispose之後,您必須釋放對導出生命上下文的所有引用,以便垃圾回收器可以回收ExportLifetimeContext佔用的內存 。

你可以做的是在DataEntry類中覆蓋Component.Dispose(bool)並在那裏調用context.Dispose。所以當出售UserControl時,ExportLifetimeContext也將被處置。