0

Prism と MEF を使用する Silverlight 5 アプリケーションで NonShared オブジェクトのメモリ リークに問題があるため、ExportFactory< T > を使用して ViewModels を作成しようとしました。ただし、ExportLifetimeContext で Dispose を呼び出しても、オブジェクトはメモリから削除されません。次のコードは DataEntryViewModel のインスタンスを作成しますが、2 行後に 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 は、メモリからオブジェクトを削除しません。それがガベージコレクターの仕事です。破棄パターンに従って、管理されていないリソースを解放できます。

次のセクションで行っていることは、問題につながります。

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

あなたは処分していますが、 oncontextへの参照を保持しているためです。context.ValueDataContext

ExportLifetimeContext.Disposeのドキュメントでは、次のように述べられています。

ExportLifetimeContext の使用が終了したら、Dispose を呼び出します。Dispose メソッドは、ExportLifetimeContext を使用できない状態のままにします。Dispose を呼び出した後、ExportLifetimeContext へのすべての参照を解放して、ExportLifetimeContext が占有していたメモリをガベージ コレクターが再利用できるようにする必要があります。

できることは、DataEntry クラスでComponent.Dispose(bool)context.Disposeをオーバーライドし、そこで呼び出すことです。したがって、UserControlが破棄されると、ExportLifetimeContextも破棄されます。

于 2013-03-20T22:37:52.423 に答える